是否可以在SQLite查询中参数化表名和列名?

我试图在SQLite中使用C#执行参数化查询,我使用的方法就是创建一个静态命令。

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

并像这样调用它:

  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; 

但我在“’@search’的行中得到错误不是一个正确的列名”或类似的东西。 如果我使用一个常量列名,只使用它的工作参数数据,但我不想创建10个不同的命令,当我需要搜索不同的列名称。

这是什么问题?

通常,诸如列名(或表名)之类的东西不能参数化 – 并且存在不同索引的事实意味着它必须在内部是不同的计划。 所以你必须使用连接 – 要小心列出已知的列名以阻止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; 

您不能以这种方式使用查询参数 – 以指示列名称。 您只能使用它来提供值。

考虑这样的事情:

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

如果你控制了这个函数的所有输入,如果它可以由你以外的其他人提供,那么这应该是安全的。 但如果search来自不受信任的第三方,请务必对该值进行适当的安全检查。