SqlParameter mit Nullable-Wert gibt Fehler während ExecuteNonQuery?
Ich habe eine sql-Abfrage, die einen parameter hat, kann null in der Datenbank (Sql Server). Die update-Methode funktionieren, bis der Benutzer eine leere im Feld, diese erzeugen einen null-Wert für die DataTime-Objekt (dieses Objekt auf null gesetzt werden). Das problem ist, wenn die dbCommand.ExecuteNonQuery();
.
Hier ist, wie Baue ich die parameter für dieses Feld:
IDataParameter dbParam_au_id = new SqlParameter();
dbParam_au_id.ParameterName = "@birthday";
dbParam_au_id.Value = birthday;
dbParam_au_id.DbType = DbType.DateTime;
dbCommand.Parameters.Add(dbParam_au_id);
Ich habe versuchen zu konvertieren, wird der null-Wert von Geburtstag zu DBNull.Wert wie das :
IDataParameter dbParam_au_id = new SqlParameter();
dbParam_au_id.ParameterName = "@birthday";
dbParam_au_id.Value = birthday??DBNull.Value;
dbParam_au_id.DbType = DbType.DateTime;
dbCommand.Parameters.Add(dbParam_au_id);
Aber dieser code wird nicht kompiliert und ich bekomme Fehler :
Fehler 1 Der Operator"??' angewendet werden kann nicht auf Operanden vom Typ " System.DateTime?' und 'System.DBNull'
Irgendeine Idee?
InformationsquelleAutor der Frage Patrick Desjardins | 2009-05-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Typen sind nicht kompatibel. Probieren Sie etwas wie dieses:
InformationsquelleAutor der Antwort David M
Wenn die SqlParameter-Klasse geschrieben wurde beim ersten mal korrekt... ein C# - null-Wert behandelt werden würde als DBNull.Wert. Das wäre intuitiv zu bedienen, so NATÜRLICH ein SqlParameter-Wert auf null ist funktionell äquivalent zu dem entfernen aus dem SqlParameterCollection.
Zur Behebung dieses lächerlich-API-design-Fehler, erstellen Sie Ihre eigene Methode AddParameter (mit überlast), die einen SqlParameterCollection, eine Zeichenkette (parameter name) und ein Objekt (parameter-Wert).
Wie Sie sehen können, im inneren, die Methode (und überlastung), wo der Wert bereits eingegeben, als ein Objekt, benutze ich den "Wert ?? DBNull.Wert" - Anweisung, um die Durchsetzung der null = DBNull.Wert-Regel.
Nun, wenn Sie übergeben Sie null-Objekt verweist oder die null festlegbaren Typen mit keine Werte an Ihre AddParameter-Methode, erhalten Sie das erwartete, intuitives Verhalten, wo ein DBNull.Wert wird an die Abfrage übergeben.
Kann ich mir nicht vorstellen, warum die API wurde implementiert, wie es ist, wenn ich es denn wollte, einen parameter ignoriert zu werden, würde ich nicht FÜGEN Sie es, und dann SETZEN Sie den Wert auf null. Ich würde entweder NICHT fügen Sie es in den ersten Platz, oder würde ich ENTFERNEN Sie Sie aus dem SqlParameterCollection. Wenn ich einen parameter HINZUZUFÜGEN, und SETZEN Sie den Wert (auch wenn auf null gesetzt), ich erwarte, dass es in der Abfrage VERWENDET werden, erwarte ich null bedeutet null-Wert.
Ich habe gehört, dass diese nicht umzusetzen, es den "richtigen" Weg aus performance-Gründen, aber das ist lächerlich, wie gezeigt, da ruft SqlParameterCollection.AddWithValue-Methode konvertiert alles zu einem Objekt sowieso, und konvertieren Sie eine Nullable-Instanz, für die kein Wert auf ein null-Objekt ist ein wesentlicher Bestandteil der C# - Sprache, die nicht eine Leistung der hit bei allen. Microsoft sollte wirklich dieses Problem beheben.
InformationsquelleAutor der Antwort Triynko