C# 将int转换为nvarchar时出错

C# 将int转换为nvarchar时出错,c#,sql,sqldatatypes,C#,Sql,Sqldatatypes,这个错误使我很困惑。我有一个具有两个输出参数的存储过程,如下所述 @agentNumber int OUTPUT, @currentAgentNum int OUTPUT, 然后使用下面的SELECT语句填充它们 SELECT @agentNumber = AgentNumber FROM AgentIdentification WHERE AgentTaxId = @ssn SELECT @currentAgentNum = AgentNumber FROM UniqueAgentIdTo

这个错误使我很困惑。我有一个具有两个输出参数的存储过程,如下所述

@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 

在代码中,最初将该值指定为字符串,因为您要将其传递为字符串


一旦运行时将其视为字符串,它将在整个代码中保留相同的类型,因此,如果您指定一个数值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;


为什么建议显式定义参数的长度?让.net和SQL server为您派生数据的成本非常小,如果您弄错了或更改了,数据将被无声地截断。这真的是最好的方法吗?@ConradFrix:问题可能是,如果不指定长度,它可能会被设置为1-通常不是您想要的…@marc_s您是否建议参数大小从parameter.value派生而来。因为不是这样的。还有,当方向不在ParameterDirection.InputOutput,ParameterDirection中时,为什么要设置值。Input@ConradFrix:嗯-如果方向不是默认的。输入,你必须设置它-不???@marc\s抱歉,我应该用不同的方式写。我的意思是问,为什么在输出参数的方向时设置参数.Value?
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 = "";