将int转换为nvarchar时出错

时间:2012-08-20 17:00:56

标签: c# sql sqldatatypes

这个错误让我非常困惑。我有一个存储过程,其中包含两个输出参数,如下所述

@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

2 个答案:

答案 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 = "";