参数分隔符

发布于 2024-12-21 20:10:29 字数 1117 浏览 3 评论 0原文

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

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

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

所有“正常”的东西、创建连接和命令都工作正常,但是,当我使用接口 IDataParameter 创建参数时,cmd.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

I have C# application we've been coding in ADO.NET. I've been using the IDbCommand, and IDbConnection interfaces to create cross-database code.

It's all worked wonderfully so far (across Firebird, SQLite, SQL Server 2005, and 2008, Access 2007, and Access 2010, and Oracle 11g).

Problem I have, is I now have an Oracle 10g database I need to support.

All the "normal" stuff, creating connections, and commands works fine, however, when I go to create a parameter using the interface IDataParameter and cmd.CreateParamater() fails on 10g, because of parameter syntax in the query (I'm using parameterized queries).

Apparently, Oracle 10g, out of the box, doesn't support using the @ sign. Oracle 11g, SQL Server, and all the others mentioned do.

For instance, the following query will fail in 10g:

select * from Products where ProductId = @ProductId

But, if I use the colon, it succeeds just fine, using the above mentioned ado.net interfaces, so this query will succeed:

select * from Products where ProductId = :ProductId

Unfortunately, the colon doesn't work in most of the other database implementations.

Or is there an option that can be flipped in the Oracle 10g Database that allows for @ delimiter to be used in place of the : delimiter for parameters.

The current solution I have is less than ideal, I have the customer/client initializing the property ParameterDelimiter (that I default to the @ sign), and use a string.Format, to insert the ParameterDelimiter.

Is there any standard way of doing this that I'm missing, without having the customer have to pass me a delimiter, or without having my base libraries know about the database implementation? (For instance, including ODP.NET and checking against an OracleConnection)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

娇纵 2024-12-28 20:10:29

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

Which 参数标记我应该使用吗? ADO.NET 2.0,Sql Server @,Oracle:(链接已死)

在这个问题中提到:

获取参数前缀ADO.NET

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

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

因此这应该是“执行此操作的标准方法”,也无需客户传递信息并且无需了解数据库 执行。

编辑:必须补充一点,System.Data.SqlClient.SqlConnection 显然返回 {0} 而不是 @{0}

For what it's worth, I did find this post:

Which parameter marker should I use? ADO.NET 2.0, Sql Server @, Oracle : (link is dead)

mentioned in this question:

Get the parameter prefix in ADO.NET

With the following code 'asking' the connection object for the information:

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

So that should be the 'standard way of doing this', also without having the customer pass the information and without having to know about the database implementation.

Edit: it must be added that System.Data.SqlClient.SqlConnection apparently returns {0} instead of @{0}.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文