[英]Returning a value from a Stored proc as an Output parameter vs a SELECT statement
[英]Output Parameter not Returned from Stored Proc
我正在調用具有3個輸出參數的SQL proc。 調用proc后,其中一個參數不返回值,而其他兩個則不返回值。 Profiler顯示所有3個值都將返回。
這些參數在過程中聲明如下:
@UsrVariableID INT OUTPUT,
@OrganisationName NVARCHAR(256) OUTPUT,
@Visible bit OUTPUT
調用proc的代碼是這樣的...
cm.Parameters.AddWithValue("@OrganisationName", name);
cm.Parameters["@OrganisationName"].Direction = ParameterDirection.Output;
cm.Parameters.AddWithValue("@Visible", visible);
cm.Parameters["@Visible"].Direction = ParameterDirection.Output;
cm.ExecuteNonQuery();
name = cm.Parameters["@OrganisationName"].Value.ToString();
visible = bool.Parse(cm.Parameters["@Visible"].Value.ToString());
id = int.Parse(cm.Parameters["@UsrVariableID"].Value.ToString());
失敗的參數是@OrganisationName。
我想知道是否是因為參數在代碼中是字符串類型,而在proc中是NVARCHAR。
任何人有任何想法嗎?
對於具有可變長度數據類型(nvarchar,varchar等)的輸出參數,我發現更明確的使用會帶來更好的結果。 如果已經發布,則在C#端未指定類型。 我可能會將事情更改為如下所示:
SqlParameter theOrganizationNameParam = new SqlParameter( "@OrganisationName", SqlDbType.NVarChar, 256 );
theOrganizationNameParam.Direction = ParameterDirection.Output;
cm.Parameters.Add( theOrganizationNameParam );
cm.ExecuteNonQuery();
name = theOrganizationNameParam.Value;
這樣,您可以確保輸出參數具有正確的數據類型,因此可以訪問Value屬性而不會引發異常。
希望這能有所啟發。
您可以嘗試先聲明參數(然后設置值),然后看看是否有所不同。
cm.Parameters.Add["@OrganisationName", SqlDbType.NVarChar, 256].Direction = ParameterDirection.Output
cm.Parameters["@OrganisationName"].Value = name
但是對我來說,您發布的內容似乎沒有什么錯。
順便說一句,如果您不需要.Parse(.ToString()),則只需要強制轉換即可。
visible = bool.Parse(cm.Parameters["@Visible"].Value.ToString());
變成
visible = (bool)cm.Parameters["@Visible"].Value;
我不是100%知道MS SQL,但是在.NET-> Oracle中,您需要指定字符串緩沖區的大小。
cm.Parameters["@OrganisationName"].Size = 256;
謝謝大家,正如Ady和Scott的建議那樣,在參數聲明中明確聲明該類型可以解決它。我選擇Scotts的答案是因為它更加簡潔。
是的,我在這里嘗試了很多事情,唯一起作用的是:您需要指定字符串的大小。
我有一個存儲過程,它返回一個字符串nvarchar(7),在C#.NET端,我指定了size = 255,這對我來說是接收7個字符的字符串。
我不喜歡這樣,因為代碼應該更專業...無論如何...
改用ParameterDirection.InputOutput-這可行
有關更多信息,請參見此處的最新評論-http: //www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic28087.aspx
實際上,這與聲明類型無關。
對於大小可變的輸出參數,必須指定參數大小。
cm.Parameters["@OrganisationName"].Size = 50;
我讀過某個地方的實現錯誤,每當未為某些數據類型指定大小時,都會引發異常。
整個過程使其非常不適合返回大小未知的參數,例如nvarchar(max)。 我建議通過SELECT而不是通過輸出參數返回值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.