繁体   English   中英

将int转换为nvarchar时出错

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM