2009-12-02 22 views
5

因此,這裏是交易。在我們的數據庫中,爲了安全性和模塊性,我們將大部分讀取(即select語句)包裝在表值函數中。所以我有一個TVF,它定義了一個或多個可選參數。如何在ADO.NET中爲表值函數調用傳遞默認關鍵字

我相信具有默認的參數的TVF要求使用關鍵字default的調用TVF像這樣的時候:

select * from fn_SampleTVF(123, DEFAULT, DEFAULT) 

這很好,一切工作在查詢分析器,但是當談到時間,實際從ADO.NET發出這個請求,我不知道如何創建一個sql參數,實際上將字default放入到呈現的sql中。

我現在有事情大致是這樣的:

String qry = "select * from fn_SampleTVF(@requiredParam, @optionalParam)"; 

DbCommand command = this.CreateStoreCommand(qry, CommandType.Text); 

SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
someRequiredParam.Value = 123; 
command.Parameters.Add(someRequiredParam); 

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

因此,任何人有任何想法如何通過default到TVF?

+1

最好的解決辦法是避免使用中的違約條款TVF參數定義,按照Kevin的建議傳入空值,並在TVF主體中手動創建默認值。這裏是我發現的一篇文章(關於Sprocs,但問題是一樣的)。 http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/3825fe1c-7b7e-4642-826b-ea024804f807 與微軟相關的所有其他的事情,讓這個工作將涉及一半烤制的解決方法。 – Mason 2009-12-02 22:43:29

回答

0

您可以傳遞Null作爲參數值。

本文介紹的例子:http://support.microsoft.com/kb/321902

+0

謝謝我會嘗試,但我相當肯定,傳遞一個顯式的null將會覆蓋tvf定義中定義的默認值,使得默認值無用。 – Mason 2009-12-02 21:42:18

+0

我很想聽聽你的發現。我很驚訝我在看到你的問題之前從未需要知道這一點。我仍然期望Null能夠工作,並且DBNull會覆蓋參數的定義。 – 2009-12-02 21:46:00

+0

是的,我剛剛檢查過,那不好。其原因是因爲有之間的差異: SELECT * FROM fn_SampleTVF(123,默認) 和 SELECT * FROM fn_SampleTVF(123,空)雖然 感謝。 – Mason 2009-12-02 21:47:11

3
SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

您不必添加上面的代碼(可選參數)的缺省值。 SQL Server將使用UDF中定義的默認值。不過,如果你想傳遞不同的值,那麼你可以通過:

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = newValue; 
command.Parameters.Add(optionalParam); 
+0

此外,它似乎(從我的測試到目前爲止),你甚至不必指定數據類型;所以你可以說: command.Parameters.Add(new SqlParameter(「@ OptionalParam」,null)); ...並且[null]將被解釋爲[default] – tbone 2015-07-08 20:48:50

+1

編輯:我之前的評論是不正確的:[null]是**不是**解釋爲[默認] – tbone 2015-07-08 21:23:27

+0

好吧,經過更多的測試,至少在當前的框架版本我正在使用,添加參數而不指定值不會導致使用默認值。使用[default]調用SSMS不會產生與傳遞無參數值相同的結果,即使這是隱含的行爲:https://msdn.microsoft.com/en-us/library/system.data。 sqlclient.sqlparameter.value%28v = vs.110%29.aspx – tbone 2015-07-08 22:44:08

1

我早就這樣做了:我見過這麼遠

public void YourMethod(int rparam, int? oparam = null) 
{ 
    String qry = string.Format("select * from fn_SampleTVF(@requiredParam, {0})" 
     , !oparam.HasValue ? "default" : "@optionalParam"); 

    SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
    someRequiredParam.Value = rparam; 
    command.Parameters.Add(someRequiredParam); 

    if (oparam.HasValue) 
    { 
     SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
     optionalParam.Value = oparam.Value; 
     command.Parameters.Add(optionalParam); 
    } 
} 
相關問題