Umgang mit leeren Werten mit ADO.NET und AddWithValue()
Habe ich eine Kontrolle, dass bei postback, speichert die Formular-Ergebnisse zurück in die Datenbank. Es füllt die Werte gespeichert werden können, Durchlaufen die querystring. So, für die folgende SQL-Anweisung (stark vereinfacht aus Gründen der Diskussion)...
UPDATE MyTable
SET MyVal1 = @val1,
MyVal2 = @val2
WHERE @id = @id
...es würde radeln Sie durch die querystring-Tasten wie folgt:
For Each Key As String In Request.QueryString.Keys
Command.Parameters.AddWithValue("@" & Key, Request.QueryString(Key))
Next
ABER ich bin jetzt in einer situation, wo unter Umständen einige dieser Variablen können nicht in den querystring. Wenn ich nicht bestehen entlang Wert2 in den querystring bekomme ich einen Fehler: System.Data.SqlClient.SqlException: Must declare the scalar value "@val2"
.
Versuche zu erkennen, wird der fehlende Wert in der SQL-Anweisung...
IF @val2 IS NOT NULL
UPDATE MyTable
SET MyVal1 = @val1,
MyVal2 = @val2
WHERE @id = @id
... fehlgeschlagen.
Was ist die beste Art und Weise zu attackieren? Muss ich Parsen der SQL-block mit RegEx, Scannen für Namen von Variablen, die nicht im querystring? Oder gibt es eine elegantere Art und Weise zu nähern?
UPDATE: Erkennung von null-Werten in den VB codebehind-Niederlagen der Zweck der Entkopplung der code aus dem Kontext. Ich möchte lieber nicht Wurf, meine Funktion mit Bedingungen für jede denkbare variable, die übergeben werden können, oder nicht bestanden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst, ich würde vorschlagen, vor dem hinzufügen alle Einträge auf den querystring als parameter-Namen, ich bin mir nicht sicher, das ist unsicher, aber ich würde es nicht riskieren.
Das problem ist, die Sie aufrufen
Stattdessen sollten Sie fordern:
Command.Parameters.AddWithValue("@val2", (object)MyValue ?? (object)DBNull.Value)
Command.Parameters.AddWithValue("@val2", If(MyValue, DBNull.Value))
. (Casting MyValue zum Objekt, die erforderlich sein könnten, wenn -- nicht testen.)Update: die Lösung, Die ich gab basiert auf der Annahme, dass es eine gespeicherte Prozedur.
Wird indem Sie einen Standardwert von Null in den SQL-Stored-proc Parameter arbeiten?
Wenn es eine dynamische sql übergeben immer die richtige Anzahl von params, ob er null ist oder der tatsächliche Wert, oder geben Sie default-Werte.
Nachdem kämpfen, um eine einfachere Lösung, gab ich auf und schrieb eine routine zum Parsen meine SQL-Abfrage für den Namen der Variablen:
Es ist ein bisschen ein hack, aber es erlaubt mir, um meinen code, selig unwissend von den Rahmen meiner SQL-Abfrage.
Nutze ich gerne die
AddWithValue
Methode.Ich immer angeben Standard-SQL-Parameter für die "optionalen" Parametern. So, wenn es leer ist, ADO.NET wird nicht die parameter, und die gespeicherte Prozedur verwenden Sie den Standardwert.
Ich nicht zu tun haben mit der überprüfung/übergabe in DBNull.Wert, Art und Weise.