操作数类型冲突:int 与 uniqueidentifier 不兼容

Posted

技术标签:

【中文标题】操作数类型冲突:int 与 uniqueidentifier 不兼容【英文标题】:Operand type ***: int is incompatible with uniqueidentifier 【发布时间】:2010-08-20 11:42:15 【问题描述】:

我收到一个 SQLException “” 当我尝试从 C# 代码执行以下存储过程时。

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 username=@username and password=@password

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
)

【问题讨论】:

是 ExecuteNonQuery 上的错误还是 AddWithValue 之一? ExecuteNonQuery 出现异常 顺便说一句,永远不要在存储过程名称前加上sp_ - 这些应该保留给系统过程。见blogs.lessthandot.com/index.php/DataMgmt/DBProgramming/… 【参考方案1】:

这是因为您调用AddWithValue,然后将值作为枚举传递(被解释为int)。

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

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

【讨论】:

我想就是这样。刚刚发现 WithValue 部分。 尝试了 Add 方法,但这次我得到异常 String[3]: Size property has an invalid size of 0. @Nadeem 你需要为你的 varchar 输出变量指定一个大小,否则它默认为 0,你不能有一个 nvarchar(0)。【参考方案2】:

这可能看起来有点多余,但是您确定列[Account_Public].[acc_num] 的数据类型实际上是uniqueidentifier 而不是int

试试这个:

cmd = new SqlCommand("select @acc_num=acc_num,@cust_name=cust_name,@balance=balance from Account_Public where username=@username and password=@password", con);
cmd.CommandType = CommandType.Text;

具有相同的参数。你也遇到同样的错误吗?

另外,我强烈建议您在所有 char 参数上指定明确的大小。对输入参数没那么重要,但对输出参数很重要。

【讨论】:

以上是关于操作数类型冲突:int 与 uniqueidentifier 不兼容的主要内容,如果未能解决你的问题,请参考以下文章

当我使用日期类型变量而不是硬编码日期时,为啥会出现“操作数类型冲突:日期与 int 不兼容”错误?

在 SQL Server 上使用用户定义的表类型的操作数类型冲突

操作数类型冲突:uniqueidentifier 与 float 不兼容

操作数类型冲突:图像与 varchar(max) 不兼容

SQL Server - 操作数类型冲突:数字与 datetimeoffset 不兼容

SQL Server Always Encrypted:操作数类型冲突:varchar 与 varchar(max) 不兼容