2012-05-02 20 views
0

(相關this post,但不一樣的。)如何將SqlParameter值設置爲SQL函數的結果?

有沒有辦法使用的SqlParameter指定的值應該在服務器調用一個函數來獲得?例如。

private void Test() 
{ 
    var cmd = new SqlCommand("update Table set ADateField = @p1 where Id = @id"); 
    cmd.Parameters.AddWithValue("@id", 42); 
    cmd.Parameters.AddWithValue("@p1", "sysutcdatetime()"); // WRONG!! 
    cmd.ExecuteNonQuery(); 
} 

我可以嵌入在CommandText字符串通話,但有時我想設置一個明確的值,而不是調用函數所以它變得有點凌亂。

我不想在客戶端計算機上獲取日期,因爲這可能與時區差異導致的服務器日期不同。

docs我看不出如何完成,但我想我會在放棄之前與你們覈對。謝謝!

+0

您是否嘗試過var cmd = new SqlCommand(「update Table set ADateField = sysutcdatetime()where Id = @id」);而不是發送@ p1作爲參數之一。 – Shailesh

+0

@Shailesh:是的,這就是我上面「嵌入CommandText」的意思。這只是有點麻煩,它會導致顯式值和默認值(當前日期)的不同代碼路徑。 –

回答

1

我不相信這是可以做到。兩種選擇是重寫SQL語句,具體取決於您是否傳遞確切的日期,或將SQL嵌入存儲過程,然後可以檢查傳入的參數以查看它是否爲空或替換正確的函數調用:

var cmd = new SqlCommand("update Table set ADateField = @p1 where Id = @id"); 
cmd.Parameters.AddWithValue("@id", 42); 
if(useFunction) 
{ 
    cmd.CommandText = cmd.CommandText.Replace("@p1", "sysutcdatetime()"); 
} 
else 
{ 
    cmd.Parameters.AddWithValue("@p1", exactDate); 
} 
cmd.ExecuteNonQuery(); 
3

無法將函數名稱作爲參數傳遞並執行。

如果你知道函數名,爲什麼不直接使用它:

var cmd = 
new SqlCommand("update Table set ADateField = sysutcdatetime() where Id = @id"); 
相關問題