2010-08-20 204 views
4

我得到一个SQLException“操作数类型冲突:int与uniqueidentifier不兼容” 当我试图从C#代码执行下面的存储过程时。操作数类型冲突: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错误吗? – 2010-08-20 11:50:49

+0

ExecuteNonQuery出现异常 – 2010-08-20 11:51:18

+1

另外,绝对不要在存储过程名称前面加上'sp_'前缀 - 它们应该是为系统过程保留的。请参阅http://blogs.lessthandot.com/index.php/DataMgmt/DBProgramming/MSSQLServer/don-t-start-your-procedures-with-sp_ – 2010-08-20 11:53:34

回答

9

这是因为你打电话AddWithValue,然后传递值作为枚举(这被解释为int)。

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

使用不同的方法(可能只是Add)。

+0

我认为就是这样。刚刚发现了WithValue部分。 – 2010-08-20 11:52:01

+0

尝试添加方法,但这次我得到异常 字符串[3]:Size属性的无效大小为0. – 2010-08-20 11:57:23

+1

@Nadeem您需要为varchar输出变量指定大小,否则默认为0,而您不能有一个nvarchar(0)。 – 2010-08-20 12:08:46

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; 

使用相同的参数。你有同样的错误吗?

此外,我强烈建议指定所有char参数的显式大小。这对于输入参数并不重要,但对输出参数非常重要。

相关问题