2011-12-17 79 views
4

我有我们在ADO.NET中编写的C#应用​​程序。我一直在使用IDbCommandIDbConnection接口来创建交叉数据库代码。 (到Firebird,SQLite,SQL Server 2005和2008,Access 2007,以及Access 2010和Oracle 11g),这一切都奏效了。参数分隔符

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

所有“正常”的东西,创建连接,并命令工作正常,但是,当我去使用接口IDataParametercmd.CreateParamater()万兆无法创建一个参数,因为在查询参数语法(我使用参数化查询)。

显然,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

+0

这是你在应用程序中嵌入的SQL文本吗?(“select * from ...” – 2011-12-17 15:42:43

+0

是的,我正在使用参数化查询,我正在生成参数,并用它们传入的值替换它们。 – 2011-12-17 15:49:17

+0

您可能需要检查连接的类型,如果你要抽象数据库类,我会建议创建一个查询生成类,通过一个抽象类来访问,就像你在创建IDbConnection时创建的一个接口一样...... – 2011-12-17 15:55:19

回答

7

对于它的价值,我也发现这个帖子:

Which parameter marker should I use? ADO.NET 2.0, Sql Server @, Oracle :(链接是死的)

在这个问题提到:

Get the parameter prefix in ADO.NET

用下面的代码“问”的连接对象的信息:

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

因此,这应该是'这样做的标准方式',也不需要客户传递信息,也不必知道数据库实现。

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

+0

绝对美丽! – 2011-12-17 16:40:38

+0

借调 - 我的+1! – dash 2011-12-17 16:42:15

+0

嘿嘿,不知道我同意'美丽',但如果它解决了你的问题,那太棒了! – 2011-12-17 16:42:35