gpt4 book ai didi

c# - 参数定界符

转载 作者:太空狗 更新时间:2023-10-30 00:34:11 25 4
gpt4 key购买 nike

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

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

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

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

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

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

select * from Products where ProductId = @ProductId

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

select * from Products where ProductId = :ProductId

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

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

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

是否有我遗漏的任何标准方法来执行此操作,而无需客户必须向我传递定界符,或者无需让我的基础库了解数据库实现? (例如,包括 ODP.NET 并检查 OracleConnection )

最佳答案

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

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}

关于c# - 参数定界符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8545758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com