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

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

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

但是,从OleDbDataReader,这段代码在第二条记录上抛出一个exception,它为“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"); } 

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

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

太棒了!

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

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

现在工作正常。

这是一种奇怪的行为。 在论坛中我发现这个问题的唯一参考是这个旧的,回到Oracle 8 !

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

从我们的直接OCI类中检索的BLOB只包含所有现有的BLOB内容,而OleDB版本有时会返回NULL,而不是所有行!

声音肯定与提供商的问题一样。 我建议使用直接OCI访问(DotNet上的Oracle Native访问),不要依赖Oracle的OleDB提供程序……

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