2010-11-10 6 views
10

Im Versuch, eine parametrisierte Abfrage in SQLite von C# auszuführen, und die im Verfahren verwendet, ist nach dem Vorbild der mitIst es möglich, Tabellen- und Spaltennamen in SQLite-Abfragen zu parametrisieren?

 SQLiteCommand cmd = new SQLiteCommand(
     "SELECT [ID]" + 
      ",[email]" + 
      ",[serializedata]" + 
      ",[restrictions]" + 
     " FROM " + UserTable + 
     " WHERE @search = @searchparam", SQLConnection); 

     cmd.Parameters.Add(new SQLiteParameter("@searchparam")); 
     cmd.Parameters.Add(new SQLiteParameter("@search")); 

einen statischen Befehl erstellen und es so nennen:

 Command.Parameters["@searchparam"].Value = searchdata; 
     Command.Parameters["@search"].Value = search; 
     SQLiteDataAdapter slda = new SQLiteDataAdapter(UserSelectUsernameCommand); 
     DataSet ds = new DataSet(); 
     slda.Fill(ds); 
     User[] array = new User[ds.Tables[0].Rows.Count]; 
     int index = 0; 
     foreach (DataRow row in ds.Tables[0].Rows) 
     { 
      array[index] = new User(this, row); 
      index++; 
     } 
     return array; 

aber Ich bekomme einen Fehler in der Zeile von '' @search 'ist kein korrekter Spaltenname' 'oder so ähnlich. Wenn ich einen konstanten Spaltennamen benutze und nur die Daten für die Parameter nutze, funktioniert es nicht, aber ich möchte keine 10 verschiedenen Befehle erstellen, wenn ich nach verschiedenen Spaltennamen suchen muss.

Was ist das Problem hier?

Antwort

12

allgemeinen Dinge wie Spaltennamen (oder Tabellennamen) können nicht parametriert werden - und die Tatsache, dass es verschiedene Indizes bedeutet, dass es hat intern einen anderen Plan zu sein. So müssen Sie Verkettung verwenden - aber darauf achten, wissen-Liste der bekannten Spaltennamen SQL-Injection zu verhindern:

SQLiteCommand cmd = new SQLiteCommand(@" 
    SELECT [ID],[email],[serializedata],[restrictions] 
    FROM " + whiteListedUserTable + @" 
    WHERE [" + whiteListedColumnName + @"] = @searchparam", SQLConnection); 

    cmd.Parameters.Add(new SQLiteParameter("@searchparam")); 
    ... 
    Command.Parameters["@searchparam"].Value = searchdata; 
2

Sie können keine Abfrageparameter in dieser Art und Weise verwenden - auf einen Spaltennamen angeben. Sie können es nur verwenden, um Werte zu liefern.

Betrachten Sie so etwas wie dies statt:

SQLiteCommand cmd = new SQLiteCommand(
    "SELECT [ID]" + 
     ",[email]" + 
     ",[serializedata]" + 
     ",[restrictions]" + 
    " FROM " + UserTable + 
    " WHERE [" + search + "] = @searchparam", SQLConnection); 

    cmd.Parameters.Add(new SQLiteParameter("@searchparam")); 

Wenn Sie alle der Eingabe dieser Funktion und keine Kontrolle, wenn sie von jemand anders als Sie geliefert werden kann, soll dies sicher sein. Aber wenn search von einer nicht vertrauenswürdigen dritten Partei stammt, stellen Sie sicher, dass Sie die entsprechenden Sicherheitsprüfungen für den Wert vornehmen.

Verwandte Themen