2010-11-10 9 views
10

Im tratando de realizar una consulta parametrizada en SQLite desde C#, y la im método que utiliza es en la línea de crear un comando estático con¿Es posible parametrizar nombres de tablas y columnas en consultas 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")); 

y decir que es así:

 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; 

pero Estoy recibiendo un error en la línea de "'@search' no es el nombre correcto de una columna" o algo así. si uso un nombre de columna constante, y solo uso los datos para los parámetros, funciona, pero no quiero crear 10 comandos diferentes para cuando necesito buscar por diferentes nombres de columna.

¿Cuál es el problema aquí?

Respuesta

12

Generalmente cosas como nombres de columna (o nombres de tabla) pueden no pueden parametrizar - y el hecho de que hay diferentes índices significa que tendrá tiene que ser un plan diferente internamente. Por lo que tendrá que utilizar la concatenación - pero tener cuidado a la lista blanca los nombres de las columnas conocidas para evitar la inyección SQL:

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

No se puede utilizar un parámetro de consulta en el que la moda - para indicar un nombre de columna. Solo puede usarlo para proporcionar valores.

considerar algo como esto en su lugar:

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

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

Si el control de la totalidad de la entrada a esta función y ninguno si puede ser suministrada por alguien que no sea usted, esto debe ser seguro. Pero si search proviene de una tercera parte que no es de confianza, asegúrese de hacer las comprobaciones de seguridad apropiadas sobre el valor.

Cuestiones relacionadas