这个错误让我非常困惑。我有一个存储过程,其中包含两个输出参数,如下所述
@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
答案 0 :(得分:4)
更改
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
在您的代码中,您最初将值指定为字符串,因为您传递的是字符串which maps to a varchar when going from the CLR type to the SQL Data Type。
一旦运行时将其视为字符串,它在整个代码中保留相同的类型,因此如果您指定一个数字(int)值,它仍然将其视为字符串。诀窍是首先为它分配正确的数据类型。
答案 1 :(得分:3)
这两行是罪魁祸首:
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 = "";