2016-11-24 158 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 
相關問題