2012-09-16 29 views
9

için DBNull.Value ve Boş metin kutusu değerini geçme Onların isteğe bağlıdır çünkü boş olabilir sayfamda Bazı metin kutularının var ve bu DAL koduveritabanına

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)); 

bu alanlardan herhangi boş edilebilir var. boşken Sorun Sonra

Procedure XXX requires @FirstName which was not supplied almak Ben

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)); 

için kodumu değiştirdi Fakat üçlü ifadesi aynı tip olması hem değeri gerektirdiğinden bu benim object özellikle döküm için dağınık görünüyor.

Neden boş dize veya boş dizge NULL veritabanında işlenmiyor? Bunu DBNull.Value'a çevirmem gerekirse daha temiz bir yol var mı? Veritabanındaki boş dize olarak değeri kaydetmeniz yardımcı olabilirdi ancak veritabanındaki NULL sorgusu dağınık olacak

Lütfen genel uygulamalarınız hakkında tavsiyelerde bulunun.

cevap

10

İlk deneyin:

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

veya Şahsen

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

aşağıdaki uzatma yöntemi kullanın:

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

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

veya

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

Komut nesnesine erişimim yok çünkü onu bir Base sınıfına ayırdım, bu yüzden onu çeşitli veritabanlarıyla [belirli bir veritabanına bağımlılıktan kaçınmak] kullanabilirim. Uzatma yöntemleri yaklaşımını seviyorum. Teşekkürler. – codingbiz

+0

"DbNullIfNull" ile bir sorun olduğunu düşünüyorum. Orada mantığı anlayamadım, bu yüzden onu .NET 4.0 projeme yazdım ve kesinlikle yanlış! Benim tahminim, geri dönüşü (obj! = Null) kodlamak mı istiyorsunuz? obj: DBNull.Value; 'yerine dönmek? = null? obj: DBNull.Value; 'Sadece bir FYI. – jp2code

+0

@ jp2code: Elbette, bu sadece bir yazım hatasıydı. Teşekkürler! Sabit. – abatishchev

2

Kayıtlı yordamdaki parametreleri varsayılan olarak isteğe bağlı yapabilirsiniz.

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

bu da çalışır ama benim DAL taşınabilir yapmaz, bu yüzden benim kodunda boş değerler işlemek zorunda. ORACLE parametreler için varsayılan değerlere izin verip vermediğini bilmiyorum. (+1) neyse – codingbiz

5

Biraz yeniden faktoring, kodu daha az dağınık hale getirebilir. 2 daha kullanışlı aşırı yükler vardır, bu

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

Saygılarımla, – codingbiz