C# 如何在具有列名的SQL查询中使用参数

C# 如何在具有列名的SQL查询中使用参数,c#,sql,sql-server,datacolumn,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

我有以下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
对象

我得到以下错误:

@TableNameCreateXLS附近的语法不正确


如何解决此错误?

使用此选项并查看其是否有效:

createtable.Parameters.AddWithValue("@TableNameCreateXLS", tbXLSTableName.Text);

使用此选项并查看其是否有效:

createtable.Parameters.AddWithValue("@TableNameCreateXLS", tbXLSTableName.Text);

不幸的是,不能将参数用于表名。我通常在人们想要查询动态表时看到这种情况,在这种情况下,我说安全的做法是使用参数查询表名表,但在您的情况下,它不起作用


因此,除了自己清理表名输入之外,我认为您没有任何SQL方法可以安全地执行此操作。如果像这样不可避免地要动态创建一个表,那么至少要确保对第一个表进行清理。

不幸的是,不能将参数用于表名。我通常在人们想要查询动态表时看到这种情况,在这种情况下,我说安全的做法是使用参数查询表名表,但在您的情况下,它不起作用


因此,除了自己清理表名输入之外,我认为您没有任何SQL方法可以安全地执行此操作。如果像这样不可避免地要动态创建一个表,那么至少要确保对第一个表进行清理。

不能对表名和列名使用参数,但可以使用方法来转义它们的值。比如:

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

不能对表名和列名使用参数,但可以使用方法转义它们的值。比如:

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

正如我在评论您之前(现在已删除)的问题时所说:“您通常无法参数化表和列名。”它被意外删除,我失去了要取消删除的页面。所以用我以前用过的命令?是的。但是首先要验证这个值,理想的情况是严格限制它。(在需要从多个表中进行选择的情况下,请使用白名单-当然,这在这里不起作用。)首先验证值是否正确:-):-):-):-)这不是kewl。正如我在对上一个(现已删除)问题的评论中所说:“通常无法参数化表名和列名。”它被无意中删除了,我丢失了要取消删除的页面。所以用我以前用过的命令?是的。但是首先要验证这个值,理想的情况是严格限制它。(如果要从多个表中进行选择,请使用白名单-当然,这在这里不起作用。)首先验证值是否正确:-):-):-):-)这不是kewl。清除表名文本框的最佳方法是什么。有SQL方法吗?@SiKni8不可否认,我不知道手动执行的好方法。几乎普遍的建议是使用参数化查询,但在这里它确实不起作用。至少去掉“(撇号)。你确定要让用户通过文本框直接访问以创建他们想要的任何表吗?好消息是,该应用程序将在我们组内部使用。坏消息是,任何人在任何时候都可能是邪恶的;)。我只允许文本框使用字母数字,所以我应该没问题。什么是清除表名文本框的最佳方法。有SQL方法吗?@SiKni8不可否认,我不知道手动执行的好方法。几乎普遍的建议是使用参数化查询,但在这里它确实不起作用。至少去掉“(撇号)。你确定要让用户通过文本框直接访问以创建他们想要的任何表吗?好消息是,该应用程序将在我们组内部使用。坏消息是,任何人在任何时候都可能是邪恶的;)。我只允许文本框使用字母数字,所以我应该没问题。