我在尝试解析参数化查询时遇到错误。 错误:错误中的令牌= @tableName
似乎变量一切正常,尝试传递字符串仍然相同。
using (SqlCeCommand command = new SqlCeCommand("SELECT * FROM @tableName WHERE @columnName = @id", connection))
{
command.Parameters.Add(new SqlCeParameter("tableName", tableName));
command.Parameters.Add(new SqlCeParameter("columnName", column));
command.Parameters.Add(new SqlCeParameter("id", id));
EDIT1:
是的,查询数据库的方式可能是错误的。例如,如果您需要在运行时的不同时间访问不同的表,那么最合适的方法就是这样做。我的意思是访问数据库的类的体系结构。
我试图用它来访问不同运行时的两个表。我只是传递这三个变量并返回输出。
如果我违反了规则,P.S道歉。EDIT2:
很抱歉,如果我没有说清楚,但是我的问题。
在运行应用程序时,哪种架构(如果我可以调用它)更适合在不同时间访问不同的数据库表?我的意思是你的解决方案是什么?是好还是坏等等。
答案 0 :(得分:0)
我相信SqlCeCommand和SqlCommands的工作方式相同,因此必须使用前导@:“@ Name”传递参数。
除了查询中的“TableName”和“columnName”应该是Sql对象名称,因此不要参数化它们。
动态构建查询,然后传递过滤参数@id。
你可以试试这样的事情:
using (SqlCeCommand command = new SqlCeCommand(string.Format("SELECT * FROM {0} WHERE {1} = @id", tableName, column), connection)) { command.Parameters.Add(new SqlCeParameter("@id", id));
答案 1 :(得分:0)
您不能在表名和列上放置参数。我也看到你正在使用SQL Compact版本。您可以在C#中设置命令,如下所示:
sqlCommand.CommandText = "SELECT * FROM " + yourtablename + " WHERE " + yourcolumnname+" LIKE @param";
sqlCommand.Parameters.Add("@param", SqlDbType.NVarChar).Value = paramVal + "%";
仅供参考,您应该知道此代码对SQL Injection开放。