【发布时间】:2015-04-17 13:44:58
【问题描述】:
我有一个庞大的程序,它已经有大量的参数查询。
在整个项目中我只通过IDbConnection、IDbCommand等接口访问数据库,而不是直接使用OleDbConnection、OleDbCommand等。
这让我可以在我的应用程序中使用不同的数据库引擎和连接类型。例如,到目前为止,我使用 OleDbConnection 连接到 MS SQL Server 数据库、用于 MySql 的 OdbcConnection 和来自外部库的 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,它会抛出错误: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();
您知道是否可以避免使用命名参数来保持与其他连接类型的兼容性?
谢谢!
弗朗西斯科
【问题讨论】:
-
您是否尝试只使用
@而不是?? -
@krillgar:我刚试过,但它给了我错误:必须声明可扩展变量'@'
-
这是我认为它会做的,但值得一试。
-
@Formentz 如果您在命令中使用它only 作为
@,那么说这个错误太正常了,因为它是 not命名参数只有它自己。 -
@xanatos 对不起,你是对的。您链接的帖子也是我问题的答案。我应该删除我的问题吗?
标签: c# .net sql-server ado.net sqlcommand