【问题标题】:C# SqlCommand and non named parameters [duplicate]C# SqlCommand 和非命名参数 [重复]
【发布时间】: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


【解决方案1】:

我不这么认为。

来自SqlCommand.Parameters property

用于 SQL Server 的 Microsoft .NET Framework 数据提供程序不 支持问号 (?) 占位符,用于将参数传递给 SQL 语句或由命令调用的存储过程 命令类型.文本。在这种情况下,必须使用命名参数

【讨论】:

  • 谢谢,我在文档中没有找到该评论...看来我必须继续使用 OleDbProvider
  • @Formentz 很高兴为您提供帮助。当然,您应该始终使用您需要的正确提供商;)
猜你喜欢
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多