如何在SQL查询中使用列名称的参数

时间:2014-06-20 15:46:07

标签: c# sql sql-server datacolumn

我有以下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);

dcDataColumn个对象。

我收到以下错误:

Incorrect syntax near @TableNameCreateXLS

如何解决错误?

3 个答案:

答案 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);