2012-09-16 16 views
9

Ich habe einige Textfelder auf meiner Seite, die leer sein kann, weil sie optional sind, und ich habe diesen DAL CodePassing DBNull.Value und leeren Textbox Wert Datenbank

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

Jedes dieser Felder leer ist. Das Problem ist, wenn sie leer sind ich Procedure XXX requires @FirstName which was not supplied erhalten

Dann änderte ich meinen Code zu

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

Aber das sieht mir unordentlich besonders das Casting zu object weil ternärer Aussage sowohl Wert erfordert die gleiche Art zu sein.

Warum wird eine leere Zeichenfolge oder Null-Zeichenfolge nicht in der Datenbank NULL behandelt? Wenn ich das in DBNull.Value konvertieren muss, gibt es einen saubereren Weg? Speichern Sie den Wert als leere Zeichenfolge in der Datenbank könnte geholfen haben, aber Abfrage für NULL in der Datenbank wird auch unordentlich

Bitte geben Sie Ihren Rat über gängige Praktiken oder etwas in der Nähe.

Antwort

10

Erstens gibt es 2 handlicher Überlastungen:

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

oder

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

persönlich verwende ich die folgende Erweiterungsmethode:

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

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

oder

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

Ich habe keinen Zugriff auf das Befehlsobjekt, weil ich es abstrahiert weg in eine Basisklasse, so dass ich es mit mehreren Datenbank verwenden kann [Vermeidung von Abhängigkeit von einer bestimmten Datenbank]. Ich mag den Ansatz der Erweiterungsmethode. Vielen Dank. – codingbiz

+0

Ich denke, etwas stimmt nicht mit 'DbNullIfNull'. Ich konnte die Logik dort nicht verstehen, also tippte ich es in mein .NET 4.0 Projekt, und es ist zweifellos falsch! Meine Vermutung ist, dass du 'return (obj! = Null) codierst? obj: DBNull.Value; 'anstelle von' return obj? = null? obj: DBNull.Value; 'Nur ein FYI. – jp2code

+0

@ jp2code: Sicher, es war nur ein Tippfehler. Vielen Dank! Fest. – abatishchev

2

Sie können die Parameter in der gespeicherten Prozedur als Standard festlegen, sodass sie optional sind.

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

dies funktioniert auch, aber nicht meine DAL portabel machen, so dass ich die Null-Werte in meinem Code zu behandeln. Ich weiß nicht, ob ORACLE Standardwerte für Parameter erlaubt. (+1) auf jeden Fall – codingbiz

5

Ein wenig Re-Factoring könnte Code weniger unordentlich machen. Versuchen Sie, diese

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

Dank Ihnen Herr – codingbiz

Verwandte Themen