我有以下SQL查询,它从文件中获取标题并创建一个与标题同名的列:
SqlCommand createtable = new SqlCommand("CREATE TABLE " + tbXLSTableName.Text + " (" + dc.ColumnName + " varchar(MAX))", myConnection);
对于SQL注入攻击是开放的,所以我决定使用这样的参数:
string strCreateTable = "CREATE TABLE @TableNameCreateXLS (" + dc.ColumnName + " varchar(MAX))";
SqlCommand createtable = new SqlCommand(strCreateTable, myConnection);
createtable.Parameters.AddWithValue("TableNameCreateXLS", tbXLSTableName.Text);
dc
是DataColumn
个对象。
我收到以下错误:
Incorrect syntax near @TableNameCreateXLS
如何解决错误?
答案 0 :(得分:5)
您不能使用表名和列名参数,但可以使用SqlCommandBuilder.QuoteIdentifier
方法来转义它们的值。像:
SqlCommandBuilder sqlBuilder = new SqlCommandBuilder();
string columnName = dc.ColumnName;//"somecolumn"
string TableNameCreateXLS = "someTable";
string escapedColumnName = sqlBuilder.QuoteIdentifier(columnName);
string escpaedTableName = sqlBuilder.QuoteIdentifier(TableNameCreateXLS);
string strCreateTable = string.Format("CREATE TABLE {0} ({1} varchar(MAX))",escpaedTableName, escapedColumnName);
答案 1 :(得分:2)
不幸的是,您不能使用表名参数。当人们想要查询动态表时,我通常会看到这样做,在这种情况下我说安全的事情是使用参数查询表名表,但在你的情况下它不起作用。< / p>
除了自己对表名输入进行消毒之外,我不认为你有任何in-SQL方法可以安全地执行此操作。如果动态创建表是不可避免的,那么至少要确保清理第一个。
答案 2 :(得分:0)
使用此功能,看看它是否有效:
createtable.Parameters.AddWithValue("@TableNameCreateXLS", tbXLSTableName.Text);