C# SqlCommand 和非命名参数

C# SqlCommand and non named parameters

我有一个庞大的程序,其中已经有大量带参数的查询。

整个项目中我只是通过IDbConnection、IDbCommand等接口访问数据库,并没有直接使用OleDbConnection、OleDbCommand等接口

这让我可以在我的应用程序中使用不同的数据库引擎和连接类型。直到现在,例如,我使用 OleDbConnection 连接到 MS SQL 服务器数据库,OdbcConnection 用于 MySql 和来自外部库的 SQLiteConnection,显然,SQLite。

现在我想尝试用 SqlConnection 替换 OleDbConnection 以连接到 SQL 服务器,但我发现参数化查询存在一些问题。

我曾经用参数化查询做类似的事情:

IDbCommand cmd = connection.CreateCommand();
cmd.CommandText = "UPDATE foo SET field1=? WHERE ID=?";
DbUtils.AddParameter(cmd, DbType.StringFixedLength, "hello");
DbUtils.AddParameter(cmd, DbType.Int32, 1);
cmd.ExecuteNonQuery();

AddParameter 静态方法检查 IDbCommand 的类型并向其添加参数值。

这适用于我在上面指定的三种连接类型,但不适用于 SqlConnection,它会抛出错误:Incorrect syntax near '?'.

SqlCommand 似乎需要命名参数才能工作:

IDbCommand cmd = connection.CreateCommand();
cmd.CommandText = "UPDATE foo SET field1=@pfield1 WHERE ID=@pID";
DbUtils.AddParameter(cmd, DbType.StringFixedLength, "@pfield1", "hello");
DbUtils.AddParameter(cmd, DbType.Int32, "@pID", 1);
cmd.ExecuteNonQuery();

您知道是否可以避免使用命名参数来保持与其他连接类型的兼容性吗?

谢谢!

弗朗切斯科

我不这么认为。

来自 SqlCommand.Parameters property

The Microsoft .NET Framework Data Provider for SQL Server does not support the question mark (?) placeholder for passing parameters to a SQL Statement or a stored procedure called by a command of CommandType.Text. In this case, named parameters must be used.