C# · 12月 24, 2021

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

我试图从C#在sqlite中执行一个参数化查询,并且im使用的方法是创建一个静态命令的行 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;