4

我有我们一直在 ADO.NET 中编码的 C# 应用程序。我一直在使用IDbCommand, 和IDbConnection接口来创建跨数据库代码。

到目前为止,这一切都运行良好(跨 Firebird、SQLite、SQL Server 2005 和 2008、Access 2007 和 Access 2010 以及 Oracle 11g)。

我的问题是,我现在有一个需要支持的 Oracle 10g 数据库吗?

所有“正常”的东西,创建连接和命令都可以正常工作,但是,当我使用接口创建参数IDataParametercmd.CreateParamater()在 10g 上失败时,由于查询中的参数语法(我正在使用参数化查询)。

显然,开箱即用的 Oracle 10g 不支持使用该@符号。Oracle 11g、SQL Server 和所有其他提到的都可以。

例如,以下查询将在 10g 中失败:

select * from Products where ProductId = @ProductId

但是,如果我使用冒号,它会成功,使用上面提到的 ado.net 接口,所以这个查询会成功:

select * from Products where ProductId = :ProductId

不幸的是,冒号在大多数其他数据库实现中不起作用。

或者是否有可以在 Oracle 10g 数据库中翻转的选项,允许使用@分隔符代替参数的:分隔符。

我目前的解决方案不太理想,我让客户/客户初始化属性ParameterDelimiter(我默认为@符号),并使用string.Format, 插入ParameterDelimiter.

有没有我遗漏的标准方法,而不需要客户向我传递分隔符,或者我的基础库不知道数据库实现?(例如,包括 ODP.NET 和检查一个OracleConnection

4

1 回答 1

8

对于它的价值,我确实找到了这篇文章:

我应该使用哪个参数标记?ADO.NET 2.0,Sql Server @,Oracle:(链接已失效)

在这个问题中提到:

在 ADO.NET 中获取参数前缀

使用以下代码“询问”连接对象的信息:

string format = connection
  .GetSchema("DataSourceInformation")
  .Rows[0]["ParameterMarkerFormat"]
  .ToString();

所以这应该是“这样做的标准方式”,也不需要客户传递信息,也不需要了解数据库的实现。

编辑:必须添加 System.Data.SqlClient.SqlConnection 显然返回{0}而不是@{0}.

于 2011-12-17T16:38:10.783 回答