Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从ODBC读取器读取Oracle CLOB数据的速度非常慢_C#_Oracle_Odbc - Fatal编程技术网

C# 从ODBC读取器读取Oracle CLOB数据的速度非常慢

C# 从ODBC读取器读取Oracle CLOB数据的速度非常慢,c#,oracle,odbc,C#,Oracle,Odbc,我们正在使用C和.NET4.5从Oracle数据库下载数据 value[]是一个对象数组; reader是ODBC读卡器,它与带有CLOB数据的Oracle数据库表具有开放连接 以下是相关代码: if (reader.Read()) { //Download and save the values for (int x = 0; x < reader.FieldCount; x++) { //Populate all the values value

我们正在使用C和.NET4.5从Oracle数据库下载数据

value[]是一个对象数组; reader是ODBC读卡器,它与带有CLOB数据的Oracle数据库表具有开放连接

以下是相关代码:

if (reader.Read())
{   //Download and save the values
    for (int x = 0; x < reader.FieldCount; x++)
    {   //Populate all the values
        values[x] = reader[x];  //this line seems to cause execution to hang
    }
    //
    //blah blah blah
    //
}
C代码似乎挂在行值[x]=读取器[x]

我们将读取的行中的每一列分配给一个特殊的对象数组,因为我们以后需要对该数据执行单独的操作,而不必担心当前的数据类型

问题在于,当一个表被一个大于28000的Oracle CLOB数据列击中时,该行似乎永远不会完成

如果我们从odbc读卡器读取的内容中删除CLOB列,那么一切都可以完美地工作

问题:

为什么会这样?数组分配不是应该相对较快吗? 有哪些可能的解决方法可以让我们在下载的数据中保留CLOB列?我们 需要将ODBC读取器保持为通用ODBC读取器,而不是特定于Oracle。 应用程序已编译,必须保持32位


谢谢

除非有令人信服的理由使用ODBC,否则最好使用ODP.net或托管ODP.net。虽然我不能百分之百肯定ODBC是您的问题,但我可以告诉您,我使用ODP.NET多次使用带LOB的.NET。我还可以告诉你,微软针对Oracle的驱动程序导致了无数的神秘问题,其中大多数都与性能有关。例如,查询1工作正常,但用绑定变量替换文本会导致执行时15秒的性能延迟。使用ODP.net,延迟消失了。我的猜测是ODBC可能有类似的神秘问题


据我所知,ODP.net或DevArt dotConnect是使.net能够利用OCI的唯一两个工具,OCI具有大量插入和更新等强大功能。OCI可能有更好的方法处理大型LOB。您必须使用ODBC有什么令人信服的原因吗?

这就是问题所在的CLOB类型! 将其转换为varchar,性能正常:

改变

select clob from table 
到2个选择

select DBMS_LOB.SUBSTR(clob,4000,1) from table where length(clob)<= 4000;
select clob from table where length(clob)> 4000;
很容易验证-对于像weel这样的小clob列,性能很慢,但是将其转换为varchar解决了这个问题

问题是,每个CLOB列的fetch都会从客户机向服务器发出两个额外的网络往返


通常情况下,您将有多行的一次净往返

Add LONGDATACOMPAT=1;在字符串连接上:

string conn = @"DSN=database;UID=user;PWD=password;LONGDATACOMPAT=1;";

谢谢@Hambone。我们使用ODBC的令人信服的原因是,这个应用程序可以针对多个数据库运行,我们不想为每个数据库专门编写代码。例如,在我脑海中,这个应用程序可以查询SQL Server、Oracle、使用32位ODBC Tibco驱动程序的遗留数据库和PostGre数据库。目前,该代码适用于除Oracle CLOB数据之外的所有内容。考虑到有限的资源,弄清楚为什么会发生这种情况将是一件好事。我现在将以此作为答案。不幸的是,我们目前没有时间/资源来测试这一理论,也没有专门使用ODP编写代码,但如果我们真的这样做了,希望我会记得回来更新这一点-