2008-10-29 89 views
3

我在調用具有3個OUTPUT參數的SQL過程。在調用proc之後,其他兩個參數中的一個不會返回值。 Profiler顯示所有3個值都被返回。未從存儲過程返回輸出參數

的PARAMS被聲明爲在proc如下...

@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 。

我想知道它是否是因爲param是代碼中的類型字符串,但proc中是NVARCHAR。

任何人有什麼想法?

+0

當你說失敗,它是否在tostring()轉換上拋出一個錯誤還是它沒有返回任何數據? 當你在SSMS中執行它時,該存儲過程是否會返回沒有錯誤? – 2008-10-29 17:49:46

+0

也許錯誤在於程序本身;實際上是否存在過程中的「SELECT @OrganisationName = something」或「SET @OrganisationName = something」? – configurator 2008-10-29 18:06:41

回答

5

通過使用具有可變長度的數據類型(nvarchar的,VARCHAR等)的輸出參數,我發現是更明確的線索,以更好的成績。在發佈的情況下,C#端沒有指定類型。我可能會改變一些事情看起來像下面這樣:

SqlParameter theOrganizationNameParam = new SqlParameter("@OrganisationName", SqlDbType.NVarChar, 256); 
theOrganizationNameParam.Direction = ParameterDirection.Output; 
cm.Parameters.Add(theOrganizationNameParam); 
cm.ExecuteNonQuery(); 
name = theOrganizationNameParam.Value; 

有了這個,你能保證輸出paratmer具有正確的數據類型,因此可以訪問價值沒有財產和異常被拋出。

希望這會流露出一些光芒。

2

您可以嘗試首先聲明參數(然後設置值),並查看這是否有所作爲。

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;
1

我不是100%地肯定MS SQL,但在.NET - >甲骨文你需要指定的字符串緩衝區的大小。

cm.Parameters["@OrganisationName"].Size = 256; 
+0

你可能會找到某種東西。我對ado.net並不熟悉,但是當我在過去使用過ADO時,我使用了這個:設置adoParam = .CreateParameter(「account_number」,adVarChar,adParamInput,20)。 20是大小。 – 2008-10-29 18:12:57

0

謝謝大家,正如Ady和Scott所建議的,在參數聲明中明確聲明類型解決了它。我選擇了Scotts答案,因爲它更簡潔。

0

其實,這不是有關聲明的類型。

對於不同大小的輸出參數,需要指定參數大小。

cm.Parameters["@OrganisationName"].Size = 50; 

我讀過的地方有一個實現中的錯誤,每當沒有爲某些數據類型指定大小時引發異常。

整件事情使它非常適合返回未知大小的參數,如nvarchar(max)。我建議通過SELECT返回值,而不是通過輸出參數。

0

是的,我在這裏嘗試了很多東西,唯一可行的是:您需要指定字符串的大小。

我有返回字符串爲nvarchar(7)的StoredProcedure並在C#的.NET側I指定的大小= 255,這是爲我工作以接收7個字符的字符串....

我不喜歡這個,因爲代碼應該更專家...反正...