有一個奇怪的問題,認爲它與我的存儲過程中的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
參數。這似乎不是這種情況,因爲存儲過程實際上執行並按預期方式移動數據。
你可以簡化你的問題,只需**最小的演示**替換大量的代碼? –
不ExecuteNonQuery()返回一個int ...因此你的存儲過程也應該返回一個int?你可能想調用ExecuteScalar()來返回一個對象 – Gwasshoppa
@Gwasshoppa'ExecuteNonQuery'返回'ROWCOUNT'值,而不是一個存儲過程的返回值。 – Dai