4

这个错误让我很困惑。我有一个带有两个输出参数的存储过程,定义如下

@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
4

2 回答 2

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 

在您的代码中,您最初将值指定为字符串,因为您向其传递了一个字符串,该字符串在从 CLR 类型转换为 SQL Data Type 时映射到一个 varchar

一旦运行时将其视为字符串,它将在整个代码中保留相同的类型,因此如果您分配一个数字 (int) 值,它仍会将其视为字符串。诀窍是首先为其分配正确的数据类型。

于 2012-08-20T17:03:25.380 回答
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 = "";
于 2012-08-20T17:10:17.243 回答