Ist es möglich zu parametrisieren Tabellen-und Spaltennamen in SQLite-Abfragen?
Im Versuch, führen Sie eine parametrisierte Abfrage in SQLite C# -, und die Methode im mit ist entlang der Linien, um ein statisches Befehl mit
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"));
und nannte es so:
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 im erhalte eine Fehlermeldung, die entlang der Linie von " '@suchen' ist nicht die richtige Spalte "name" oder so ähnlich. wenn ich eine Konstante verwenden, die Spalte name, und nur die Daten für den Parameter funktioniert es, aber ich möchte nicht 10 verschiedene Befehle für wenn ich brauche, um Suche durch unterschiedliche Spaltennamen.
Was ist hier das Problem?
- Wenn Sie sind zu vermeiden, erstellen von 10 verschiedenen Kommandos, wegen der Ineffizienz der Bindung jeweils einer SqliteConnection und Aufbau Ihrer Parameter und CommandText über und über, ich bin nur so sicher, dass die Leser wissen, dass es eine alternative gibt. SqliteCommand hat einen parameterlosen Konstruktor nur neue SqliteCommand(); und die Connection-Eigenschaft zuweisbare zur Laufzeit. So können Sie erstellen und initialisieren Sie viele Befehle einfach mal aus und weisen Sie dann Ihre Verbindung-Eigenschaft auf eine SqliteConnection Objekt, das wiederholt erstellt und entsorgt werden zur Laufzeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Regel Dinge, wie Spaltennamen (Tabelle oder Namen) kann nicht parametriert werden - und die Tatsache, dass es verschiedene Indizes bedeutet, dass es haben, um einen anderen plan intern. So haben Sie, um verwenden Verkettung - aber vorsichtig sein, um white-Liste der bekannten Spaltennamen für sql-injection verhindern:
Können Sie eine Abfrage verwenden, die parameter in dieser Art und Weise-zu zeigen, den Namen einer Spalte. Sie können nur verwenden, um Werte angeben.
Betrachten Sie so etwas wie dies:
Wenn das alles Steuern Sie den Eingang auf diese Funktion und keine, wenn es geliefert werden kann von jemand anderem als Ihnen, sollte dies sicher sein. Aber wenn
search
stammt aus einer nicht vertrauenswürdigen Dritten Partei, sicher sein, um die entsprechenden Sicherheitskontrollen auf den Wert.