在 C# 中参数化 ALTER/DROP TABLE OdbcCommand
Parameterize ALTER/DROP TABLE OdbcCommand in C#
我正在尝试将代码中的 SQL 语句从连接字符串转换为参数化查询,但我无法像这样将其用于 DROP TABLE
和 ALTER TABLE
:
using (OdbcCommand delCmd = new OdbcCommand($"DROP TABLE IF EXISTS ?", dbConnection))
{
delCmd.Parameters.Add(new OdbcParameter("?", OdbcType.NVarChar) { Value = tableName });
delCmd.ExecuteNonQuery();
}
using (OdbcCommand delCmd = new OdbcCommand($"ALTER TABLE ? DROP COLUMN ?", dbConnection))
{
delCmd.Parameters.Add(new OdbcParameter("?", OdbcType.NVarChar) { Value = tableName });
delCmd.Parameters.Add(new OdbcParameter("?", OdbcType.NVarChar) { Value = columnName });
delCmd.ExecuteNonQuery();
}
我曾尝试将 []
或 ''
添加到查询字符串或参数中,但我从未成功。
我得到运行时间错误:
ERROR [42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Incorrect
syntax near '@P1'. `
任何关于如何让这些查询起作用的建议都会帮上大忙!
您不能提供table,字段名称作为参数;但是你可以使用格式化或字符串插值:
//TODO: validate tableName and columnName here
//since formatting / string interpolation prone to SQL injection
// e.g.
// if (!Regex.IsMatch(tableName, "^[A-Za-z][A-Za-z0-9_]*$")) {/* wrong table */}
using (OdbcCommand delCmd = new OdbcCommand(
$"ALTER TABLE {tableName} DROP COLUMN {columnName}",
dbConnection))
{
delCmd.ExecuteNonQuery();
}
我正在尝试将代码中的 SQL 语句从连接字符串转换为参数化查询,但我无法像这样将其用于 DROP TABLE
和 ALTER TABLE
:
using (OdbcCommand delCmd = new OdbcCommand($"DROP TABLE IF EXISTS ?", dbConnection))
{
delCmd.Parameters.Add(new OdbcParameter("?", OdbcType.NVarChar) { Value = tableName });
delCmd.ExecuteNonQuery();
}
using (OdbcCommand delCmd = new OdbcCommand($"ALTER TABLE ? DROP COLUMN ?", dbConnection))
{
delCmd.Parameters.Add(new OdbcParameter("?", OdbcType.NVarChar) { Value = tableName });
delCmd.Parameters.Add(new OdbcParameter("?", OdbcType.NVarChar) { Value = columnName });
delCmd.ExecuteNonQuery();
}
我曾尝试将 []
或 ''
添加到查询字符串或参数中,但我从未成功。
我得到运行时间错误:
ERROR [42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Incorrect syntax near '@P1'. `
任何关于如何让这些查询起作用的建议都会帮上大忙!
您不能提供table,字段名称作为参数;但是你可以使用格式化或字符串插值:
//TODO: validate tableName and columnName here
//since formatting / string interpolation prone to SQL injection
// e.g.
// if (!Regex.IsMatch(tableName, "^[A-Za-z][A-Za-z0-9_]*$")) {/* wrong table */}
using (OdbcCommand delCmd = new OdbcCommand(
$"ALTER TABLE {tableName} DROP COLUMN {columnName}",
dbConnection))
{
delCmd.ExecuteNonQuery();
}