簡體   English   中英

不從存儲過程返回輸出參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM