参数分隔符

本文关键字:分隔符 参数 | 更新日期: 2023-09-27 18:18:04

我有一个c#应用程序,我们一直在ADO.NET编写。我一直在使用IDbCommandIDbConnection接口来创建跨数据库代码。

到目前为止,这一切都运行得很好(跨越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)

参数分隔符

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

我应该使用哪个参数标记?ADO。. NET 2.0, Sql Server @, Oracle:(link is dead)

这个问题中提到的

:

获取ADO中的参数前缀。净

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

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

所以这应该是"做这件事的标准方式",也不需要让客户传递信息,也不需要知道数据库的实现。

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