2017-12-14 2 views
0

Wenn Sie das Zeug auskommentiert, kann ich leicht zu arbeiten, indem Benutzereingaben direkt in der Abfrage hinzufügen, aber wenn ich versuche, es zu parametrisieren, keine der Werte für die Parameter werden ...SqlCommmand Parameter nicht zu UPDATE-Anweisung (C#, MVC)

hinzugefügt einen Fehler

Dieser Code

definieren Must Tabellenvariable @formTable

aber das Problem ist keiner der Werte wirft hinzufügen nicht nur die Tabellenvariable (verifiziert durch re Tabellenname-Variable mit statischem Text platzieren).

Ich habe viele Insert-Anweisungen in diesem Projekt genau so strukturiert, die perfekt funktionieren. Was mache ich hier falsch?

string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 

using (SqlConnection con = new SqlConnection(constr)) 
{ 
    //string query = "UPDATE " + s.formTable + " SET " + s.column + " = '" + s.cellValue + "' WHERE MasterID = '" + s.id + "'"; 
    string query = "UPDATE @formTable SET @column = @cellValue WHERE MasterID = @id;"; 

    using (SqlCommand cmd = new SqlCommand(query)) 
    { 
     //SqlParameter param = new SqlParameter("@formTable", s.formTable); 
     //cmd.Parameters.Add(param); 
     cmd.Parameters.AddWithValue("@formTable", s.formTable); 
     cmd.Parameters.AddWithValue("@column", s.column); 
     cmd.Parameters.AddWithValue("@cellValue", s.cellValue.ToString()); 
     cmd.Parameters.AddWithValue("@id", s.id.ToString()); 

     cmd.Connection = con; 

     con.Open(); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
    } 
} 

Antwort

1

Parameter sind für Werte, nicht Objekt-IDs (Tabellen, Spalten, etc.), so dass die einzigen gültigen Parameter Sie sind @cellValue und @id.

Wenn Sie Tabellen-/Spaltennamen basierend auf Benutzereingaben dynamisch festlegen möchten, betrachten Sie wahrscheinlich String-Verkettung. Allerdings, das bedeutet nicht unbedingt SQL-Injektion. Alles, was Sie tun müssen, ist, die Benutzereingabe anhand einer Menge bekannter Werte zu validieren und den bekannten Wert in der Verkettung zu verwenden.

Angenommen, Sie haben einen List<string> mit all Ihren Tabellennamen. Es kann fest codiert sein, wenn sich Ihre Tabellen nie ändern werden, oder Sie können es dynamischer machen, indem Sie querying some system/schema tables in der Datenbank angeben, um es zu füllen.

Wenn ein Benutzer einen Wert für einen Tabellennamen eingibt, überprüfen Sie, ob er in der Liste enthalten ist. Wenn dies der Fall ist, verwenden Sie diesen übereinstimmenden Wert aus der Liste. Wenn dies nicht der Fall ist, behandeln Sie die Fehlerbedingung (z. B. das Anzeigen einer Nachricht für den Benutzer). Also, obwohl Sie String-Verkettung verwenden, wird keine tatsächliche Benutzereingabe jemals in die Zeichenfolge eingegeben. Sie verketten nur bekannte gute Werte, die nicht anders ist als die Zeichenfolge Literale, die Sie jetzt haben.