C# .NET中的OraOLEDB提供程序在CLOB字段上是否不可靠?

C# .NET中的OraOLEDB提供程序在CLOB字段上是否不可靠?,c#,.net,oracle,C#,.net,Oracle,我有一个查询似乎从OleDbDataReader返回了错误的数据。我在下面包含了实际代码(用户id和密码已更改)。我正在运行Oracle Express 10g 如果我在OracleWebAdmin实用程序中从Toad运行下面的SQL,或者如果我将下面的代码更改为OracleConnection,则返回的所有4条记录在“answer_text”列中都有值 然而,在OleDbDataReader中,这段代码在第二条记录上抛出了一个异常,它为“answer_text”返回null,而不是预期的值:“

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

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

然而,在OleDbDataReader中,这段代码在第二条记录上抛出了一个异常,它为“answer_text”返回null,而不是预期的值:“这是第二条开放式注释。现在事情真的越来越疯狂了。”

该字段在数据库中定义为CLOB

所以我的问题是,OraOLEDB提供程序完全不可靠吗?这真是一种不稳定的行为。4条记录中有3条正确返回数据。简单地用OleDbConnection替换OracleConnection并从连接字符串中删除“Provider”似乎就可以了

不过,出于分销/支持的原因,我认为我的客户不想这样做。Oracle只是我们支持的四家数据库供应商中的一家,而这段代码在其他数据库中运行良好

这是已知的bug吗?有什么神秘的场景我不知道吗?我对甲骨文没有太多的经验,在谷歌上搜索这个问题也找不到任何东西。如有任何建议,将不胜感激

        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");
        }

那是一种奇怪的行为。我在论坛上找到的关于这样一个问题的唯一参考是

在非托管Delphi代码中调试我们的开源DB类时,我发现了同样的问题! 因此,这听起来不像是DotNet或ADO错误,而是OraOleDB提供程序端的一个问题…:(

从中检索到的BLOB只包含所有现有BLOB内容,但有时返回NULL,而不是所有行

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


我使用最新的Oracle 11g客户端和服务器,以及Win64下的32位客户端对此进行了测试。

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

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

太棒了

在包含两条记录(tiff文件)的记录集成功显示第一条记录但在第二条记录上给出错误re:参数类型的情况下,出现了类似的问题

已确定OLE修复程序的修补程序中只有一个dll已更改,并已替换此单个dll(oracle客户端bin目录中的OraOLEDBrst11.dll)


现在工作正常。

驱动程序本身不会抛出任何类型的错误。它们只会在应该返回数据时返回null。因此在上面的示例中,您会得到一个异常消息:“这不应该发生”。我刚刚用DotNet软件在真正的Oracle 11g数据库上进行了测试。当我使用System.Data.OracleClient提供程序(即直接OCI访问)时,我得到了所有的BLOB。当我使用System.Data.OleDb(即OLE DB提供程序)时,以“OraOLEDB.Oracle.1”作为提供程序(即Oracle官方提供程序),一些blob返回为NULL。当我使用OLE DB“MSDAORA”提供程序(即Microsoft提供的已弃用的Oracle提供程序,我在尝试选择此表时出错)。听起来很像是一个bug。你应该使用
System.Data.OracleClient
而不是OLEDB…:(