2012-06-04 37 views
1

你看到的東西公然錯這行:存儲過程在C#中連接方法的輸出參數

commaSepString1 = com.Parameters["@CommaSepString"].Value.ToString(); 

它顯示瞭如下錯誤:

Object reference not set to an instance of an object.

對於總之, C#方法如下所示:

public static DataTable GetFilmDetails(string filmId, out string 
commaSepString1) 

它採用下列存儲過程(即在其自己的正確執行):

com.CommandText = "CatalogGetFilmDetails2"; 

而且由於@CommaSepString是在存儲過程中輸出參數,在C#中我有這樣的:

param = com.CreateParameter(); 
param.ParameterName = "@CommaSepString"; 
param.Direction = ParameterDirection.Output; 
param.DbType = DbType.String; 
com.Parameters.Add(param); 

commaSepString1 = com.Parameters["@CommaSepString"].Value.ToString(); 

如果你是好奇的存儲過程,它開始像這樣: CREATE PROCEDURE CatalogGetFilmDetails2

(@FilmID int, @CommaSepString VARCHAR(50) OUTPUT) AS 

的SP插入一些行到基於某些聯接表變量,它把所有的值從x列從該表爲一個字符串與逗號分隔值:

SELECT @CommaSepString 
= STUFF((SELECT ', ' + Categ FROM @Filme1 FOR XML PATH('')), 1,1,'') 

然後它選擇該表。

感謝您的耐心閱讀。如果我發佈存儲過程和C#方法的完整代碼,會更清楚嗎?不知道我是否被允許,並擔心它可能太長而不能閱讀。

PS:必須有不對勁有關commaSepString!代碼在我將它添加到兩個地方之前完美工作。

+1

在什麼時候你實際調用存儲過程? –

+1

我的問題與Michael提出的問題相同。您的代碼片段不會顯示正在調用的存儲過程。由於該參數被指定爲輸出,因此不會在未調用存儲區的情況下設置該值,並將其保留爲空。您的空引用可能是由於嘗試針對該參數的值調用ToString方法。 –

+1

代碼不希望返回數據庫NULL。 'commaSepString1 = com.Parameters [「@ CommaSepString」]。Value == DBNull.Value? null:(string)(com.Parameters [「@ CommaSepString」]。Value);' – HABO

回答

0

您應該設置一個斷點違規行,那麼你應該檢查你的參數集合,以檢查是否存在參數。
如果存在,則檢查其值是否爲空。
在這種情況下,.ToString()會給你描述的錯誤。

+0

非常感謝!在執行存儲過程之前,我很荒謬地使用輸出參數。我只是修正了這個順序,但現在我得到了另一個錯誤:** String [1]:Size屬性的大小爲0 **我認爲這可能只是由於存儲過程不返回任何結果的參數?我怎樣才能自行檢查存儲過程? –

+1

添加一個'param.Size = 100;'或者你期望的是返回的字符串的長度,同時確保將存儲過程設置更新爲相同的大小'nvarchar(100)'。 [MSDN參考](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.size.aspx) – Steve

+0

善良,它的工作原理!我從來沒有想過這樣的解決方案。這是我第一次遇到這個表達式:** param.Size **。我會記住它。謝謝gazillions,史蒂夫! –

1

SQL Server不知道output,只知道input/output。所以,當你指定

param.Direction = ParameterDirection.Output; 

SQL Server實際上也會讀取字符串。由於您未提供值,因此SQL Server會確定其長度爲零。

令人難以置信的是,如果你指定一個神奇的數字-1,SQL Server將確定大小爲您提供:

param.Size = -1; 

這也許是關於ADO.NET第二差的疑難雜症。 僅次於事實SQL NULL轉化爲DBNull.Value,而不是null

+0

+1,在返回DBNull.Value之後.. argh! – Zachary

相關問題