2010-11-10 18 views
10

Im tentando di eseguire una query con parametri in SQLite da C#, e il metodo di im utilizzando è lungo le linee di creare un comando statico conÈ possibile parametrizzare i nomi di tabelle e colonne nelle query SQLite?

 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")); 

e chiamando in questo modo:

 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; 

ma sto ottenendo un errore lungo la linea di "'@ ricerca' non è un nome di colonna corretto" o qualcosa del genere. se uso un nome di colonna costante, e uso solo i dati per i parametri, funziona, ma non voglio creare 10 diversi comandi per quando ho bisogno di cercare per nomi di colonne differenti.

Qual è il problema qui?

risposta

12

Generalmente cose come nomi di colonna (o nomi di tabella) possono non parametrizzare - e il fatto che ci sono diversi indici significa che essa deve essere un piano diverso internamente. Quindi si dovrà usare la concatenazione - ma stare attenti al bianco-list i nomi delle colonne noti per prevenire SQL injection:

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

Non è possibile utilizzare un parametro di query in quel modo - per indicare un nome di colonna. Puoi usarlo solo per fornire valori.

consideri qualcosa di simile a questo, invece:

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

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

Se controlli tutto l'input a questa funzione e nessuno se può essere fornito da una persona diversa da te, questo dovrebbe essere al sicuro. Ma se search proviene da una terza parte non attendibile, assicurarsi di effettuare i controlli di sicurezza appropriati sul valore.

Problemi correlati