【问题标题】:Is OraOLEDB provider in .NET unreliable on CLOB fields?.NET 中的 OraOLEDB 提供程序在 CLOB 字段上是否不可靠?
【发布时间】:2011-05-27 02:35:23
【问题描述】:

我的查询似乎从 OleDbDataReader 返回了错误的数据。我在下面包含了实际代码(用户 ID 和密码已更改)。我在 Oracle Express 10g 上运行。

如果我在 Toad 的 Oracle Web 管理实用程序中运行下面的 SQL,或者如果我将下面的代码更改为 OracleConnection,则返回的所有 4 条记录在“answer_text”列中都有值。

然而,从 OleDbDataReader 中,此代码在第二条记录上引发异常,它为“answer_text”返回 null 而不是预期值:“这是第二条开放式评论。现在事情真的变得疯狂了。”

相关字段在数据库中定义为 CLOB。

所以我的问题是,OraOLEDB 提供商是否完全不可靠?这真的是很不靠谱的行为。 4 条记录中有 3 条正确返回数据。只需使用 OleDbConnection 更改 OracleConnection 并从连接字符串中删除“Provider”似乎可以正常工作。

不过,出于分发/支持的原因,我认为我的客户不想这样做。 Oracle 只是我们支持的 4 家数据库供应商中的 1 家,此代码适用于其他供应商。

这是一个已知的错误吗?我缺少一些神秘的设置吗?我在 Oracle 方面没有太多经验,我在谷歌上搜索这个问题也找不到任何东西。任何建议将不胜感激。

        var connection = new OleDbConnection("Provider=OraOLEDB.Oracle;Data Source=localhost;User Id=x;Password=x;");
        connection.Open();
        var command = connection.CreateCommand();
        command.CommandText = "select response_id, item_id, subitem_id, answer_id, answer_text, other_text, column_answer_id from sur_response_answer where item_id in (180, 181)";
        var reader = command.ExecuteReader();
        while (reader.Read())
        {
            if (reader.IsDBNull(reader.GetOrdinal("answer_text")))
                throw new Exception("This should not be happening");
        }

【问题讨论】:

  • 驱动程序本身不会抛出任何类型的错误。他们只是在应该返回数据时返回 null。因此,在上面的示例中,您会收到一条异常消息:“这不应该发生”。

标签: c# .net oracle


【解决方案1】:

Oracle 支持存在错误 9866728,但这适用于 OLEDB 提供程序 11.2.0.1。它已在文档 1272856.1 中列出的补丁中得到修复。要访问这些文档和补丁,您需要一个 Oracle 支持帐户。

关于 Oracle Express 10g,众所周知,它是一个不受支持的版本(从未发布过补丁),存在一些已知错误 - 我不会将它用于生产应用程序。加入 Oracle 合作伙伴网络将允许您使用开发/测试许可证来开发和测试实际版本,而不是过时的(虽然免费......)。

【讨论】:

    【解决方案2】:

    太棒了!

    在包含两条记录(tiff 文件)的记录集成功显示第一条记录但在第二条记录上给出错误 re:argument type 时遇到类似问题。

    确定 OLE 修复补丁中只有一个 dll 被更改,并且仅替换了这个单个 dll(oracle 客户端 bin 目录中的 OraOLEDBrst11.dll)。

    现在工作正常。

    【讨论】:

      【解决方案3】:

      这是一种奇怪的行为。我在论坛中找到的唯一参考是this old one, back to Oracle 8

      在非托管 Delphi 代码中调试我们的开源 DB 类,我发现了同样的问题! 所以这听起来不像是 DotNet 或 ADO 错误,而是 OraOleDB 提供者方面的问题...... :(

      our direct OCI classes 检索到的 BLOB 只包含所有现有的 BLOB 内容,而 the OleDB version 有时会返回 NULL,而不是针对所有行!

      听起来确实像是提供商的问题。我建议使用直接 OCI 访问(DotNet 上的 Oracle 本机访问),不要依赖 Oracle 的 OleDB 提供程序...

      我用最新的 Oracle 11g 客户端和服务器测试了这个,在 Win64 下使用 32 位客户端。

      【讨论】:

      • 我刚刚在真正的Oracle 11g 数据库上进行了测试,使用了DotNet 软件。当我使用 System.Data.OracleClient 提供程序(即直接 OCI 访问)时,我得到了所有 BLOB。当我使用 System.Data.OleDb(即 OLE DB 提供程序),以“OraOLEDB.Oracle.1”作为提供程序(即 Oracle 官方提供程序)时,一些 BLOB 返回为 NULL。当我使用 OLE DB "MSDAORA" 提供程序(即 Microsoft 提供的已弃用的 Oracle 提供程序时,我在尝试对此表执行 SELECT 时出现错误)。听起来绝对像一个错误。您应该使用 System.Data.OracleClient 而不是 OLEDB... :(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      相关资源
      最近更新 更多