簡體   English   中英

如何在帶有列名的SQL查詢中使用參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM