2012-09-16 30 views
9

我有我的網頁上的一些文本框,因爲它們是可選的,可以是空的,我有這個DAL代碼傳遞DBNull.Value和空文本框的值到數據庫

parameters.Add(new SqlParameter("@FirstName", FirstName)); 
parameters.Add(new SqlParameter("@LastName", LastName)); 
parameters.Add(new SqlParameter("@DisplayName", DisplayName)); 
parameters.Add(new SqlParameter("@BirthDate", BirthDate)); 
parameters.Add(new SqlParameter("@Gender", Gender)); 

任意字段可以爲空。問題是,當他們是空的,我收到Procedure XXX requires @FirstName which was not supplied

然後,我改變了我的代碼

parameters.Add(new SqlParameter("@FirstName", String.IsNullOrEmpty(FirstName) ? DBNull.Value : (object)FirstName)); 
parameters.Add(new SqlParameter("@LastName", String.IsNullOrEmpty(LastName) ? DBNull.Value : (object) LastName)); 
parameters.Add(new SqlParameter("@DisplayName", String.IsNullOrEmpty(DisplayName) ? DBNull.Value : (object) DisplayName)); 
parameters.Add(new SqlParameter("@BirthDate", BirthDate.HasValue ? (object)BirthDate.Value : DBNull.Value)); 
parameters.Add(new SqlParameter("@Gender", String.IsNullOrEmpty(Gender) ? DBNull.Value : (object) Gender)); 

但由於三元語句需要兩個值是相同的類型,這看起來凌亂我尤其是鑄件object

爲什麼數據庫中的空字符串或空字符串未被處理NULL?如果我必須將其轉換爲DBNull.Value有沒有更清晰的方法?將值保存爲數據庫中的空字符串可能會有所幫助,但在數據庫中查詢NULL也會產生混亂

請給出關於常見實踐或與之相關的建議。

回答

10

首先,有2個更加得心應手重載:

command.Parameters.Add("@name").Value = value; 

command.Parameters.AddWithValue("@name", value); 

我個人使用下面的擴展方法:

public static object DbNullIfNull(this object obj) 
{ 
    return obj != null ? obj : DBNull.Value; 
} 

command.Parameters.AddWithValue("@name", value.DbNullIfNull()); 

public static object DbNullIfNullOrEmpty(this string str) 
{ 
    return !String.IsNullOrEmpty(str) ? str : (object)DBNull.Value; 
} 
+0

我沒有訪問命令對象的權限,因爲我將它抽象爲一個Base類,所以我可以將它用於多個數據庫[避免依賴特定數據庫]。我喜歡擴展方法方法。謝謝。 – codingbiz

+0

我覺得'DbNullIfNull'有問題。我無法理解那裏的邏輯,所以我將它輸入到.NET 4.0項目中,這肯定是錯誤的!我的猜測是你打算編寫'return(obj!= null)? obj:DBNull.Value;'而不是'返回obj? = null? obj:DBNull.Value;'只是一個參考。 – jp2code

+0

@ jp2code:當然,這只是一個錯字。謝謝!固定。 – abatishchev

2

您可以在存儲過程中默認參數,使其成爲可選參數。

create procedure XXX 
(
    @FirstName nvarchar(50) = null, 
    @LastName nvarchar(50) = null, 
    ... 
) 
+0

這也適用,但不會讓我DAL便攜,所以我要處理我的代碼空值。我不知道ORACLE是否允許參數的默認值。 (+1) – codingbiz

5

稍微重新考慮因素可能會使代碼更加混亂。試試這個

dbParams.Add(SetDBNullIfEmpty("@FirstName", FirstName)); 
dbParams.Add(SetDBNullIfEmpty("@LastName", LastName)); 
dbParams.Add(SetDBNullIfEmpty("@DisplayName", DisplayName)); 
dbParams.Add(SetDBNullIfEmpty("@BirthDate", BirthDate)); 
dbParams.Add(SetDBNullIfEmpty("@Gender", Gender)); 

private SqlParameter SetDBNullIfEmpty(string parmName, string parmValue) 
{ 
    return new SqlParameter(parmName, String.IsNullOrEmpty(parmValue) ? DBNull.Value : (object)parmValue)); 
} 
+0

感謝您的致辭 – codingbiz