fle*_*sod 2 c# sql-server sql-server-2008 sqlparameter
我收到运行时错误说"Must declare the table variable "@parmTableName".不允许在sql语句中将表名作为sql参数.
有没有比允许sql注入攻击更好的选择或建议?我不想为sql语句做这个C#脚本" 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();
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 10
去寻找白名单.只能有一组固定的可能反正表名正确的价值观-至少,所以我希望.
如果您没有表名的白名单,则可以从字符白名单开始- 如果您将其限制为AZ,az和0-9(根本没有标点符号),那么这应该消除很多问题.(当然这意味着你不支持奇怪名字的表格...我们在这里并不真正了解你的要求.)
但不,您不能将参数用于表名或列名 - 仅限值.这通常是数据库中的情况; 我不记得看到其中一个做了支护参数为.(我敢说有一些,当然......)
正如其他人已经指出你不能在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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11285 次 |
| 最近记录: |