Как использовать параметры в SQL-запросе с именем столбца

У меня есть следующий запрос 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

Как я могу устранить ошибку?

3 ответа

Решение

Вы не можете использовать параметры для имени таблицы и имени столбца, но вы можете использовать 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);
Другие вопросы по тегам