2010-08-20 3 views
4

Я получаю SQLException «Опознание типа операнд: int несовместимо с uniqueidentifier» , когда я пытаюсь выполнить приведенную ниже хранимую процедуру из кода C#.Тип операнда clash: int несовместим с uniqueidentifier

create proc sp_Get_Allfields_Account_Public 
@username varchar(20), 
@password varchar(20), 
@acc_num UniqueIdentifier out, 
@cust_name varchar(20) out, 
@balance float out 
as 
select @acc_num=acc_num,@cust_name=cust_name,@balance=balance from Account_Public where [email protected] and [email protected] 

C# код выглядит следующим образом

cmd = new SqlCommand("sp_Get_Allfields_Account_Public", con); 
       cmd.CommandType = CommandType.StoredProcedure; 

       // Add Input Parameters 
       cmd.Parameters.AddWithValue("@username", username); 
       cmd.Parameters.AddWithValue("@password", password); 

       // Add output parameters 
       cmd.Parameters.AddWithValue("@acc_num", SqlDbType.UniqueIdentifier); 
       cmd.Parameters["@acc_num"].Direction = ParameterDirection.Output; 

       cmd.Parameters.AddWithValue("@cust_name", SqlDbType.VarChar); 
       cmd.Parameters["@cust_name"].Direction = ParameterDirection.Output; 

       cmd.Parameters.AddWithValue("@balance", SqlDbType.Float); 
       cmd.Parameters["@balance"].Direction = ParameterDirection.Output; 

       cmd.ExecuteNonQuery(); 

определение Таблица

create table Account_Public 
(
acc_num uniqueidentifier, 
cust_name varchar(20), 
username varchar(20), 
password varchar(20), 
balance float 
) 
+0

Является ли ошибка в ExecuteNonQuery или одной из AddWithValue? –

+0

Исключением является ExecuteNonQuery –

+1

Как в стороне, никогда не префикс имен хранимых процедур с 'sp_' - они должны быть зарезервированы для системных процедур. См. Http://blogs.lessthandot.com/index.php/DataMgmt/DBProgramming/MSSQLServer/don-t-start-your-procedures-with-sp_ –

ответ

9

Это потому, что вы вызываете AddWithValue, а затем передаете значение как перечисление (которое интерпретируется как int).

cmd.Parameters.AddWithValue("@acc_num", SqlDbType.UniqueIdentifier); 

Используйте другой способ (возможно, только Add).

+0

Я думаю, что это он. Просто заметили часть WithValue. –

+0

Tried Add метод, но на этот раз я получаю исключение String [3]: свойство Size имеет недопустимый размер 0. –

+1

@Nadeem Вам нужно указать размер для переменной varchar output, в противном случае по умолчанию она равна 0, а вы не может иметь nvarchar (0). –

0

Это может показаться немного излишним, но вы уверены, что тип данных столбца [Account_Public].[acc_num] фактически uniqueidentifier и не int?

Попробуйте вместо этого:

cmd = new SqlCommand("select @acc_num=acc_num,@cust_name=cust_name,@balance=balance from Account_Public where [email protected] and [email protected]", con); 
cmd.CommandType = CommandType.Text; 

с теми же параметрами. Вы получаете ту же ошибку?

Кроме того, I сильно рекомендуют указывать явные размеры для всех параметров char. Это не так важно для входных параметров, но это очень важно для выходных.

Смежные вопросы