2008-09-17 42 views
5

我無法找到一種優雅的方式來使用TableAdapter從存儲過程獲取返回值。如何從TableAdapter檢索存儲過程返回值

在使用非標量存儲過程調用時,TableAdapter似乎不支持SQL存儲過程返回值。你會希望自動生成函數的返回值是存儲過程的返回值,但它不是(它實際上是受影響的行數)。儘管可能使用'out'參數並將一個變量作爲ref傳遞給自動生成的函數,但這不是一個非常乾淨的解決方案。

我在網上看到一些醜陋的黑客來解決這個問題,但沒有像樣的解決方案。任何幫助,將不勝感激。

+0

事實上,我有同樣的問題,它是可笑的,返回值不支持,沒有黑客 – nicodemus13 2008-12-19 15:04:10

回答

0

關閉此問題,因爲它出現返回值不支持,並沒有優雅的解決方法!

1

獲取返回值的方法是在其方向設置爲ParameterDirection.ReturnValue的SqlCommand對象上使用SqlParameter。調用Fill後,您應該檢查TableAdapter的SelectCommand屬性。

+0

SelectCommand屬性是(AFAIK)私人的TableAdapter。因此,我必須擴展每個TableAdapter的部分類,在我看來,這不是我希望找到的優雅解決方案。 – 2008-09-17 11:18:09

0

我不能肯定地說,因爲我沒有使用TableAdapter,但是您可能需要查看您的存儲過程,並在您的過程中包含以下內容。

SET ROWCOUNT OFF 

BEGIN 
<Procedure Content> 
END 

SET ROWCOUNT ON 
+0

感謝您的建議,但不幸的是,設置ROWCOUNT似乎無法解決我的問題。 – 2008-10-02 09:44:48

1

:去使用SqlParameter的方向在哪裏= ParameterDirection.ReturnValue

隨着中說的方式,正如有人已經提到SqlParameters,這裏是使用DataSet動態方法替代。 (如果這就是你怎麼騎):

例如,SQL語句和C#作爲休耕:

string sql = @"DECLARE @ret int 
      EXEC @ret = SP_DoStuff 'parm1', 'parm2' 
      SELECT @ret as ret"; 

DataSet ds = GetDatasetFromSQL(sql); //your sql to dataset code here... 

int resultCode = -1; 
int.TryParse(ds.Tables[ds.Tables.Count-1].Rows[0][0].ToString(), out resultCode); 

存儲過程結果加載到數據集,將有儘可能多的數據表作爲返回在存儲過程中的SELECT語句。

DataSet中的最後一個DataTable將有1行和1列包含存儲過程返回值。

1

事實上,所有你需要做的是從使用SELECT語句,沒有return語句存儲過程返回的最終值。 SELECT的結果將是返回值。例如,如果你只是簡單地使你的sp退出語句爲「SELECT 1」,那麼你將返回1.現在只需選擇你想返回的實際標量。