Parametrisierte Abfrage und NULL DateTime-Wert
Arbeite ich ein Programm, das das ziehen ein string-Feld aus einer access-Datenbank, die Trennung der Namen (erste und Letzte) von einem Datum, dann speichern Sie den Namen, getrennt von dem Datum in einer anderen access-Datenbank.
Habe ich alles getan, außer einige der Datum-Werte null sind, so muss ich einstellen, SQL, aber ich habe nicht in der Lage gewesen, um herauszufinden, wie die Parametrisierung Arbeit.
Ich habe in dummy-Werte für die variable und fügt Sie der Tabelle gut. Ich habe schneiden Sie den anderen Variablen in den code-snippet unten, da Sie alle Wiederholungen, was da ist. os ist eine Liste von holding-Daten aus einer Struktur.
string sqlcmd = "INSERT INTO signatures VALUES ('" + os.QASignature + "', 'QADate = @QADATE'";
System.Data.OleDb.OleDbCommand SQLCommand = new System.Data.OleDb.OleDbCommand(sqlcmd, Connection);
using (SQLCommand)
{
SQLCommand.Parameters.Add("@QADATE", System.Data.OleDb.OleDbType.Date).Value = os.QADate;
SQLDataReader = SQLCommand.ExecuteReader();
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Etwas wie die folgenden sein sollten, was Sie wollen:
Wenn os.QADate null-Werte zulässt (
DateTime?
oderSystem.Nullable<DateTime>
), dann würden Sie Folgendes tun:Beachten Sie, dass Sie sollten nicht mischen Sie die string-Verkettung und Parameter wie in deinem ursprünglichen Beispiel - es ist das ein oder andere! Und wirklich, es sollte nur Parametrierung zum Schutz vor SQL-Injection, zu nutzen und andere Vorteile (wie einfacher eingeben und, in einigen RDBMS, parametrisierte Abfragen besser).
Beachten Sie auch, dass OleDBCommand nicht nutzen, benannte Parameter - Parameter müssen Hinzugefügt werden, um die Abfrage in der Reihenfolge erscheinen Sie in der SQL. Dies ist der Grund, warum die SQL-Abfrage enthält zwei Fragezeichen - Sie sind einfach Platzhalter.
Müssen Sie auf "convert" -
null
zuDBNull.Wert
. Ein Weg, das zu erreichen, vorausgesetzt, QADate ist ein nullable DateTime (so DateTime?) könnte sein:?? die null-coalescing-operator.
Edit: Man könnte eigentlich müssen Stimmen, um sicherzustellen, dass beide Operanden vom gleichen Typ:
Auch, warum nicht verwenden Sie einen parameter für QASignature?? Warum sind Sie "inlining" das Wert? Ich weiß nicht, was QASignature enthalten würde, doch dies lässt Sie anfällig für SQL-Injection.
Und schließlich, warum sind Sie mit ExecuteReader() für einen Einsatz? Warum nicht ExecuteNonQuery()?
DateTime kann nicht null sein, wenn der Wert nicht initialisiert ist DateTime.MinValue.
Sie testen müssen für diesen Fall und verwenden Sie die Parameter für die string-Werte.
Durch die Art und Weise, eine insert-Anweisung in der Regel wird ausgeführt, indem
ExecuteNonQuery
DateTime
kann nicht null sein, in der Tat,DateTime?
jedoch können 🙂 ich gehe davon aus, dass die letzteren, da user1533116 heißt es: "einige der date-Werte sind null'.Verwenden DBNull.Wert:
Als seitliche Anmerkung, mit OleDbParameterCollection.AddWithValue automatisch leitet die Daten geben und können Sie den code verkürzen:
Erwägen Sie die Verwendung der Nullable(of T) Struktur. Dann können Sie es nur, wenn es tatsächlich eine variable in der Quelle-Objekt. Andernfalls wird der Wert auf Null gesetzt ist, und geht sich schön in die SQL-Parameter. Viele von den alten TableAdapter-Klassen und neuere Entity Framework-Objekte arbeiten mit Nullable (of T) - Struktur.