Как использовать параметры в 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);