[英]How to use parameters in SQL query with column name
我有以下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
我該如何解決該錯誤?
您不能對表名和列名使用參數,但是可以使用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);
不幸的是,您不能使用參數作為表名。 我通常會在人們要查詢動態表時看到此操作,在這種情況下,我說安全的做法是使用參數查詢表名表,但對您而言不起作用。
因此,除了自己清理輸入的表名之外,我認為您沒有任何SQL安全方法可以安全地執行此操作。 如果像這樣不可避免地動態創建表,那么至少要確保對第一個表進行清理。
使用它,看看是否可行:
createtable.Parameters.AddWithValue("@TableNameCreateXLS", tbXLSTableName.Text);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.