我试图从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;