2012-10-19 48 views
3

此代碼爲我工作得非常好:是否有更優雅的形式來分配NULL到InsertCommand的NVarChar?

if (someStr == null) 
    da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = DBNull.Value; 
else 
    da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr; 

但我的直覺告訴我,有可能是它的一個班輪版本。喜歡的東西:

da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr==null ? DBNull.Value : someStr ; 

但當然,一個班輪我剛剛張貼以上失敗,因爲DBNull.Value不轉換爲字符串。

有沒有一種方法可以實現我所希望的單線輪廓?

+3

您可以將someStr投到一個對象 – cadrell0

+0

@ cadrell0您的方法有效!請發表回答,以便我可以接受。 – scatmoi

+1

我們已經在鑄造過程中完成了這項工作:(object)DBNull.Value應該爲你做。 (或類似的關閉語法) –

回答

6

你可以施放someStr一個對象

例如:

da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr==null ? DBNull.Value : (object)someStr; 

或者你可以像Oded和Servy建議的那樣使用擴展方法。雖然它可能會添加幾行代碼,但它會爲您節省重複代碼。

正如塞維維指出的那樣,將其放在object上可能會導致混亂。爲此,我會把它放在SqlParameter

public static void SetValue(this SqlParameter parameter, object value) 
{ 
    parameter.Value = value == null ? DBNull.Value : value; 
} 

然後使用它像這樣

da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).SetValue(someStr); 
4

創建一個函數或擴展方法,將根據需要進行測試並進行分配。傳入someStr和參數名稱。

然後,您將可以在一行中設置參數。

+0

這很優雅,但是打敗了減少代碼行數量的目的。 – scatmoi

+1

@scatmoi - 爲什麼這個目標如此理想?如果你正確地分解了這樣的功能,它可以重複使用許多參數,從而減少整體LOC。 – Oded

+0

你當然是對的,但看到我對@Servy的評論。 – scatmoi

4

您可以使用下面的擴展方法(或使其成爲非擴展方法,如果你喜歡)

public static object ConvertNull(this object obj) 
{ 
    return obj ?? DBNull.Value; 
} 

那麼你可以這樣做:

da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr.ConvertNull() 
+0

很漂亮。但是將額外的代碼行從一個地方移動到另一個地方。我希望ConvertNull()是一個C#庫函數。 – scatmoi

+1

@scatmoi如果你只做過一次,它會增加代碼行。如果你不止一次地減少它。如果你碰巧只做過一次,那麼就不要做這個方法(但我懷疑是這種情況)。 – Servy

+0

+1它在擴展方法類中增加1-2行,您可以反覆利用。我比以前的實現更喜歡這一點。 –

2
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = ((object)someStr) ?? DBNull.Value; 
0

編寫用於插入你的論點爲空的存儲過程,設置默認值,使用存儲你的插入命令的程序,然後不要只是將該參數傳遞給該sproc。

相關問題