我有一个查询似乎从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");
}
答案 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位客户端进行了测试。