将 nvarchar 转换为数据类型 int 时出错

Posted

技术标签:

【中文标题】将 nvarchar 转换为数据类型 int 时出错【英文标题】:Error converting nvarchar to data type int 【发布时间】:2015-03-14 04:10:42 【问题描述】:

当我尝试在我的网站中调用我的存储过程表单代码时出现此错误。我已经被困了很长一段时间,因为我不知道我在哪里将一个值转换或声明为整数。这是我的 SQL 语句:

create procedure GetRepPhoneID
@Rep        nvarchar(100),
@phoneID    nvarchar(100) output
as
set @phoneID = (select concat(CustomerRepPh, '~', cast(RepID as nvarchar(100))) as 'PhoneAndID'
from Reps
where CustomerRep=@Rep)
return @phoneID
go

然后从我后面的 c# 代码中我试图调用存储过程:

公共静态字符串 GetRepPhone(字符串 Rep) 字符串连接 = WebConfigurationManager.ConnectionStrings["JDC_DatabaseConnectionString"].ConnectionString; SqlConnection sqlConnection = new SqlConnection(Connection);

    //This funciton will take all of the values and create them.
    try
    
        sqlConnection.Open();
    
    catch (Exception err)
    
        Console.WriteLine(err.Message);
    

    SqlCommand cmd = new SqlCommand();
    cmd.Connection = sqlConnection;
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "GetRepPhoneID";           //getting the  procedure created in SQL.

    SqlParameter CustomerParam = new SqlParameter();
    CustomerParam.ParameterName = "Rep";
    CustomerParam.SqlDbType = SqlDbType.NVarChar;
    CustomerParam.Value = Rep;
    CustomerParam.Direction = ParameterDirection.Input;

    //We are using an output parameter not a return one because it is a string.
    SqlParameter ReturnParam = new SqlParameter("phoneID", SqlDbType.NVarChar, 100);
    ReturnParam.Direction = ParameterDirection.Output;

    cmd.Parameters.Add(CustomerParam);
    cmd.Parameters.Add(ReturnParam);

    cmd.ExecuteNonQuery();

    sqlConnection.Close();
    return ReturnParam.Value.ToString();

我在我的代码中多次做同样的事情,但它们都返回整数,所以没有抛出错误,所以我知道它应该可以工作。错误被抛出cmd.ExecuteNonQuery() 行。确切的错误是:

Conversion failed when converting the nvarchar value '(111)222-6666~29' to data type int.

我知道我无法将该字符串转换为整数,但我在代码中没有看到我声明整数或尝试转换的任何地方。

任何帮助将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

您将RETURN 值与OUTPUT 参数混淆了。 RETURN 是INT 类型的可选状态代码。将另一个参数声明为 OUTPUT。

意思是,这在存储过程中是无效的:

return @phoneID

相反,将@phoneID nvarchar(100) OUTPUT 添加到参数列表并删除DECLARE @PhoneID

CREATE PROCEDURE GetRepPhoneID
(
  @Rep        NVARCHAR(100),
  @phoneID    NVARCHAR(100) OUTPUT
)
AS
SET NOCOUNT ON;

SELECT @phoneID = concat(CustomerRepPh, '~', RepID)
FROM Reps
WHERE CustomerRep = @Rep;

以上代表整个过程。您不需要RETURNSET

然后在 C# 代码中,您需要更改该参数的指定方式:

SqlParameter ReturnParam = new SqlParameter("phoneID", SqlDbType.NVarChar, 100);
ReturnParam.Direction = ParameterDirection.Output;

然后删除此行,因为它不需要,因为参数的值将在连接关闭后保留:

string PhoneAndID = cmd.Parameters[1].Value.ToString();

并将return 更改为:

return ReturnParam.Value.ToString();

最后,您可能需要更新输入参数的声明,如下所示:

SqlParameter CustomerParam = new SqlParameter("Rep", SqlDbType.NVarChar, 100);
CustomerParam.Value = Rep;
CustomerParam.Direction = ParameterDirection.Input;

【讨论】:

感谢您的帮助。这摆脱了原来的错误,但现在抛出String[1]: the Size property has an invalid size of 0. @ChaseErnst 我刚刚用参数声明编辑了 C# 部分。 这让我回到了原来的错误。我已将问题更新为我当前的代码。 @ChaseErnst 你没有做我所有的编辑。您仍然有使用 RETURN 的初始问题。我完整地发布了存储的过程代码。我发布了一个最终编辑,展示了如何在 C# 代码中声明输入参数。 哦,是的,我刚刚注意到这一点,并做出了改变,这对我来说很有效。感谢您的帮助和耐心!

以上是关于将 nvarchar 转换为数据类型 int 时出错的主要内容,如果未能解决你的问题,请参考以下文章

将 nvarchar 值...转换为数据类型 int 时转换失败

将数据类型 NVarchar 转换为 int 时出错

SQL 异常:将 nvarchar 值“[anyvalue]”转换为数据类型 int 时转换失败

System.Data.SqlClient.SqlException:“将 nvarchar 值 'STORES' 转换为数据类型 int 时转换失败。”

nvarchar 值转换为数据类型为 int 发生语法错误

将 nvarchar 值转换为数据类型 int 和其他 SQL Server 错误时失败