C# 参数分隔符

C# 参数分隔符,c#,oracle,ado.net,odp.net,parameterized-query,C#,Oracle,Ado.net,Odp.net,Parameterized Query,我用ADO.NET编写了一个C应用程序。我一直在使用IDbCommand和IDbConnection接口来创建跨数据库代码 到目前为止,Firebird、SQLite、SQLServer2005和2008、Access2007和Access2010以及Oracle11g都运行得非常好 我的问题是,我现在需要支持一个Oracle 10g数据库 所有正常的东西,创建连接和命令都可以正常工作,但是,当我使用接口IDataParameter和cmd.CreateParameter创建参数时,在10g上失

我用ADO.NET编写了一个C应用程序。我一直在使用IDbCommand和IDbConnection接口来创建跨数据库代码

到目前为止,Firebird、SQLite、SQLServer2005和2008、Access2007和Access2010以及Oracle11g都运行得非常好

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

所有正常的东西,创建连接和命令都可以正常工作,但是,当我使用接口IDataParameter和cmd.CreateParameter创建参数时,在10g上失败,因为我使用的是参数化查询中的参数语法

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

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

select * from Products where ProductId = @ProductId
但是,如果我使用冒号,使用上述ado.net接口,它会成功,因此此查询将成功:

select * from Products where ProductId = :ProductId
不幸的是,冒号在大多数其他数据库实现中不起作用

或者,Oracle 10g数据库中是否有一个可翻转的选项,允许使用@delimiter代替参数的:delimiter

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


有没有什么标准的方法可以做到这一点,而不需要客户给我一个定界符,或者不需要我的基本库知道数据库的实现?例如,包括ODP.NET并检查OracleConnection的价值,我确实发现了这篇文章:

林克死了

在这个问题中提到:

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

string format = connection
  .GetSchema("DataSourceInformation")
  .Rows[0]["ParameterMarkerFormat"]
  .ToString();
因此,这应该是“执行此操作的标准方法”,也无需客户传递信息,也无需了解数据库实现


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

这是嵌入到应用程序中的SQL文本吗?选择*from…是的,我正在使用参数化查询,我正在生成参数,并用它们传入的值替换它们。您可能需要检查连接类型并生成特定于Oracle的查询。如果您要对数据库类进行抽象,我建议您创建一个查询生成类,该类通过抽象访问,就像您在创建IDbConnection时创建的接口一样……我无法检查OracleConnection类型,因为这需要添加对ODP.NET的引用,我在问题中提到过这一点。所以我把参数分隔符放在里面。我从来没有用过Oracle,但是你能用吗?和位置参数?例如,从ProductId=?呵呵,我不确定我是否同意“美丽”这个词,但如果它能解决你的问题,那就太好了@michielvoo,这个michielvoo的一个警告是,提供的代码对SqlConnection不起作用。但是,如果你访问你的链接,在ADO.NET中获取参数前缀,他在底部有修复它的代码,可能想为将来的读者更新你的答案:@BrianDeragon:谢谢,我用免责声明更新了我的答案。