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

时间:2011-05-27 02:35:23

标签: c# .net oracle

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

如果我在Oracle Web Admin Utility中运行以下SQL,来自Toad,或者如果我将下面的代码更改为OracleConnection,则返回的所有4条记录都在“answer_text”列中包含值。

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

有问题的字段在数据库中定义为CLOB。

所以我的问题是,OraOLEDB提供商是否显然不可靠?这是非常不稳定的行为。 4条记录中的3条正确返回数据。简单地用OleDbConnection更改OracleConnection并从连接字符串中删除“Provider”似乎工作正常。

但是,出于分发/支持的原因,我认为我的客户不想这样做。 Oracle只是我们支持的4个数据库供应商中的一个,这个代码在其余部分工作正常。

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

太棒了!

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

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

现在工作正常。

答案 2 :(得分:0)

这是一种奇怪的行为。我在论坛中发现的唯一一个问题是this old one, back to Oracle 8

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

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

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

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