我收到运行时错误"Must declare the table variable "@parmTableName"
。不允许在sql语句中将表名作为sql参数。
有没有比允许sql注入攻击更好的选择或建议?我不想为sql语句" DELETE FROM " + tableName + " "
;
using(var dbCommand = dbConnection.CreateCommand())
{
sqlAsk = "";
sqlAsk += " DELETE FROM @parmTableName ";
sqlAsk += " WHERE ImportedFlag = 'F' ";
dbCommand.Parameters.Clear();
dbCommand.Parameters.AddWithValue("@parmTableName", tableName);
dbConnection.Open();
rowAffected = dbCommand.ExecuteNonQuery();
}
答案 0 :(得分:10)
寻找白名单。无论如何,表名只能有一组固定的可能的正确值 - 至少,我希望如此。
如果您没有白名单的表名,则可以从字符的白名单开始 - 如果您将其限制为AZ,az和0-9(根本没有标点符号)那应该消除很多关注。 (当然这意味着你不支持奇怪名字的表格......我们在这里并不真正了解你的要求。)
但不,你不能使用表名或列名的参数 - 只能使用值。这通常是数据库中的情况;我不记得看到做了支持参数的那个。 (我敢说当然有一些......)
答案 1 :(得分:6)
正如其他人已经指出你不能在Sql Parameter中使用表名和字段,你可以尝试的一件事是使用SqlCommandBuilder 转义表名,如:
string tableName = "YourTableName";
var builder = new SqlCommandBuilder();
string escapedTableName = builder.QuoteIdentifier(tableName);
using (var dbCommand = dbConnection.CreateCommand())
{
sqlAsk = "";
sqlAsk += " DELETE FROM " + escapedTableName; //concatenate here
sqlAsk += " WHERE ImportedFlag = 'F' ";
dbCommand.Parameters.Clear();
dbConnection.Open();
rowAffected = dbCommand.ExecuteNonQuery();
}
答案 2 :(得分:-4)
(sqlAsk是字符串,对吗?)如果它是正确的,那么让我们试试这个:
using(var dbCommand = dbConnection.CreateCommand())
{
sqlAsk = "";
sqlAsk += " DELETE FROM <table_name> ";
sqlAsk += " WHERE ImportedFlag = 'F' ";
string table_name = "Your table name here"; //<- fill this as u need
sqlAsk = sqlAsk.Replace("<table_name>", table_name); // it will replace <table_name> text to string table_name
dbConnection.Open();
rowAffected = dbCommand.ExecuteNonQuery();
}