2016-11-24 105 views
0

有一个奇怪的问题,认为它与我的存储过程中的OUT参数有关?SqlException,将数据类型nvarchar转换为int时出错

存储过程:

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参数。这似乎不是这种情况,因为存储过程实际上执行并按预期方式移动数据。

+0

你可以简化你的问题,只需**最小的演示**替换大量的代码? –

+0

不ExecuteNonQuery()返回一个int ...因此你的存储过程也应该返回一个int?你可能想调用ExecuteScalar()来返回一个对象 – Gwasshoppa

+0

@Gwasshoppa'ExecuteNonQuery'返回'ROWCOUNT'值,而不是一个存储过程的返回值。 – Dai

回答

1

@Gwashoppa,thx花时间回答我的问题。据我了解,返回值不能与OUTPUT参数混合使用。但在任何情况下,我找到了解决方案 - 数据类型和长度必须明确设置:

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

我认为发生在AddWithValue功能,但显然不是。

0

您的C#代码看起来很好......行cmd.ExecuteNonQuery();引发异常,表示该错误必须与SP使用的某些参数一致。

您将需要隔离的措施,找出问题所在区域的SP ...

例如,在本声明的ResetHistory表已经于您选择使用同一列类型?

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 
... 

在此声明中,mobilephone列是否返回一个Varchar值?

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

在这个声明中,system列是否返回一个Varchar值?

SELECT rq.[system] 
FROM ResetQueue rq 
WHERE rq.[User_ID] = @user 
相关问题