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

时间:2016-11-24 01:28:50

标签: c# sql sql-server stored-procedures

有一个奇怪的问题,认为它与我的存储过程中的OUT参数有关吗?

存储过程:

ALTER PROCEDURE [dbo].[uspProcessResetRequest] 
    @user uniqueidentifier, 
    @company uniqueidentifier,
    @mobile nvarchar(50) OUT, -- return phone number
    @system nvarchar(256) OUT -- return system name
AS
BEGIN
    SET NOCOUNT ON;

    SET @mobile = 'error' --for debugging
    SET @system = 'error' --for debugging

    -- Select matching row from ResetQueue into temporary table
    INSERT INTO ResetHistory ([User_ID], MobilePhone, Company_ID, [System], [Status], ResetIP)
        SELECT 
            rq.[User_ID], u.MobilePhone, u.Company_ID, rq.[System], '3', rq.ResetIP 
        FROM  
            ResetQueue rq
        INNER JOIN 
            [User] u ON rq.[User_ID] = u.ObjectGuid
        WHERE 
            u.Company_ID = @company 
            AND rq.[User_ID] = @user 
            AND rq.[Status] = '2'           

    SELECT @mobile = u.[MobilePhone] 
    FROM [user] u 
    WHERE u.ObjectGuid = @user

    SELECT @system = rq.[system] 
    FROM ResetQueue rq 
    WHERE rq.[User_ID] = @user

    DELETE FROM ResetQueue 
    WHERE [User_ID] = @user
END

调用C#代码:

try
{
    using (SqlConnection conn = new SqlConnection(strConnection))
    {
        using (SqlCommand cmd = new SqlCommand("dbo.uspProcessResetRequest", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@user", SqlDbType.UniqueIdentifier).Value = strUser;
            cmd.Parameters.AddWithValue("@company", SqlDbType.UniqueIdentifier).Value = strCompany;
            cmd.Parameters.AddWithValue("@mobile", SqlDbType.NVarChar).Direction = ParameterDirection.Output;
            cmd.Parameters.AddWithValue("@system", SqlDbType.NVarChar).Direction = ParameterDirection.Output;

            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();

            string[] strResult = new string[] { (string)cmd.Parameters["@mobile"].Value, (string)cmd.Parameters["@system"].Value };

            return strResult;
        }
    }
}
catch (Exception err)
{
    string strError = err.Message; // Log error
    return new string[] { "", "" };
}

存储过程运行得很好 - 所有代码都被执行但cmd.ExecuteNonQuery();抛出异常:

  

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

所以我放松了输出值。

我怀疑OUT参数面临一些问题,但似乎无法破解这个问题...

我为此问题找到的大多数其他帖子都涉及提交到SqlInt参数的文字值。这似乎不是这个的情况,因为存储过程实际执行并按预期移动数据。

2 个答案:

答案 0 :(得分:1)

@Gwashoppa,thx花时间回答我的问题。据我所知,返回值不能与OUTPUT参数混合使用。但无论如何我找到了解决方案 - 数据类型和长度需要明确设置:

cmd.Parameters["@mobile"].SqlDbType = SqlDbType.NVarChar;
cmd.Parameters["@mobile"].Size = 50;

我认为这发生在AddWithValue函数中,但显然不是。

答案 1 :(得分:0)

你的C#代码看起来很好......行cmd.ExecuteNonQuery();抛出异常这一事实表明错误必须与SP使用的某些参数有关。

您需要逐步隔离SP以确定问题区域......

例如,在此语句中,ResetHistory表与select中使用的列类型相同吗?

INSERT INTO ResetHistory ([User_ID], MobilePhone, Company_ID, [System], [Status], ResetIP)
SELECT rq.[User_ID], u.MobilePhone, u.Company_ID, rq.[System], '3', rq.ResetIP
FROM ResetQueue rq
...

在此声明中,手机列是否返回Varchar值?

SELECT u.[MobilePhone] 
FROM [user] u 
WHERE u.ObjectGuid = @user

在此语句中,系统列是否返回Varchar值?

SELECT rq.[system] 
FROM ResetQueue rq 
WHERE rq.[User_ID] = @user