[英]Error converting int to nvarchar
这个错误让我非常困惑。 我有一个存储过程,其中包含两个输出参数,如下所示
@agentNumber int OUTPUT,
@currentAgentNum int OUTPUT,
然后使用下面的SELECT语句填充它们
SELECT @agentNumber = AgentNumber
FROM AgentIdentification
WHERE AgentTaxId = @ssn
SELECT @currentAgentNum = AgentNumber
FROM UniqueAgentIdToAgentId
WHERE AgentId = @agentId
在数据库中, AgentNumber
在两个表中定义为int
。 但是,当我在我的C#代码中调用此存储过程时,我得到一个SQL异常,说明:
将数据类型int转换为nvarchar时出错。
如果我将输出参数的数据类型更改为nvarchar
,则代码将执行,但它只会返回整数的第一个数字。 下面是如何在C#代码中定义变量
SqlParameter outNewAgentNumber = new SqlParameter("@agentNumber", "");//Output parameter - leave blank
SqlParameter outCurrentAgentNumber = new SqlParameter("@currentAgentNum", "");//Output parameter - leave blank
outNewAgentNumber.Direction = ParameterDirection.Output;
outCurrentAgentNumber.Direction = ParameterDirection.Output;
我将这些参数添加到SqlCommand
对象,指定适当的数据库和commandType
,然后使用.ExecuteNonQuery()
来调用该过程。 同样,我真正感到困惑的是错误消息,指出我正在使用nvarchar
作为数据类型,这只能(据我所知)指的是数据库端的东西。 但是,正如我所说,我已经进行了双重/三重检查,并且两个AgentNumber
列都是int
类型。
编辑
将sqlParameter声明更改为起始值0已解决此问题。 我现在遇到了另外两个参数的问题。
SqlParameter outOperator = new SqlParameter("@operator", "");//Output parameter - leave blank
SqlParameter outDate = new SqlParameter("@date", "");//Output parameter - leave blank
更改
SqlParameter outNewAgentNumber = new SqlParameter("@agentNumber", "");//Output parameter - leave blank
SqlParameter outCurrentAgentNumber = new SqlParameter("@currentAgentNum", "");//Output parameter - leave blank
至
SqlParameter outNewAgentNumber = new SqlParameter("@agentNumber", 0);//Output parameter - leave blank
SqlParameter outCurrentAgentNumber = new SqlParameter("@currentAgentNum", 0);//Output parameter - leave blank
在您的代码中,您最初将值指定为字符串,因为您正在向它传递一个字符串, 该字符串在从CLR类型转换为SQL数据类型时映射到varchar 。
一旦运行时将其视为字符串,它在整个代码中保留相同的类型,因此如果您指定一个数字(int)值,它仍然将其视为字符串。 诀窍是首先为它分配正确的数据类型。
这两行是罪魁祸首:
SqlParameter outNewAgentNumber = new SqlParameter("@agentNumber", "");
SqlParameter outCurrentAgentNumber = new SqlParameter("@currentAgentNum", "");
通过将空字符串( ""
)指定为第二个参数,ADO.NET运行时假定它是字符串参数。 而且由于你没有指定任何长度 - 它可能默认只有一个字符长度(这就是为什么它只返回第一个数字)。
所以,我的建议是始终为SQL参数显式定义数据类型(如果它是一个字符串 - 也定义一个长度!):
SqlParameter outNewAgentNumber = new SqlParameter("@agentNumber", SqlDbType.Int);
outNewAgentNumber.Direction = ParameterDirection.Output;
outNewAgentNumber.Value = 0;
要么
SqlParameter outNewAgentNumber = new SqlParameter("@agentNumber", SqlDbType.NVarChar, 50);
outNewAgentNumber.Direction = ParameterDirection.Output;
outNewAgentNumber.Value = "";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.