我有一个庞大的程序,它已经有很多带参数的查询。
在整个项目中,我只通过IDbConnection,IDbCommand等接口访问数据库,而不是直接使用OleDbConnection,OleDbCommand等。
这允许我在我的应用程序中使用不同的数据库引擎和连接类型。例如,到目前为止,我使用OleDbConnection连接到MS SQL Server数据库,从外部库连接到ODScConnection for MySql和SQLiteConnection,显然是SQLite。
现在我想尝试用SqlConnection替换OleDbConnection以连接到SQL Server,但我发现参数化查询存在一些问题。
我习惯用参数化查询做类似的事情:
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一起使用,它会抛出错误:'?'附近的语法不正确。
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();
您是否知道是否可以避免使用命名参数来保持与其他连接类型的兼容性?
谢谢!
弗朗西斯
答案 0 :(得分:3)
我不这么认为。
来自SqlCommand.Parameters
property
SQL Server的Microsoft .NET Framework数据提供程序不支持 支持将参数传递给a的问号(?)占位符 SQL语句或命令调用的存储过程 CommandType.Text。在这种情况下,必须使用命名参数 。