取出大数据量CLOB数据

来源:互联网 发布:淘宝店费用一年多少钱 编辑:程序博客网 时间:2024/04/27 13:28

VC中,用ADO取出大数据量CLOB数据(可能有几十M)循环取数据,第一次取时没有问题,取完后我关闭了记录集,第二次取时没问题,在关闭记录集时就出错?如果不关闭记录集,那在第三次取数据时,在m_pRecordset.CreateInstance(__uuidof(Recordset));就出错,User breakpoint called from code at 0x77f767cd    网上查此问题有人说是内存没管理好会出这种问题?但我小数据量时没问题,大数据量就有问题
小数据量测试是没有取那个CLOB数据,只取了其它字符串字段的值。
 

sgnaw(李逍遥) ( 两星(中级)) 信誉:115    Blog

发现一个好东西, 原来 oracle 早就想到别人可能会用其它语言来访问他们的数据库, 因此, 他们已经封闭好了一些类了. 可以用 VC++ 和 Visual Basic 来访问各种类型的数据, 非常之方便. 比如他用下面三句话就可以打开一个表了:
OStartup();
ODatabase odb("ExampleDB", "scott", "tiger");
ODynaset odyn(odb, "SELECT * FROM PART");

给 Visual C++ 提供的是 OO4O C++ Class Library , 是个静态库, 有相应的 include 头文件还有 MFC 的 Demo 比如 oracle 9i 位置在
$oracle/ora90/oo4o/CPP

例如有个表
SQL> desc test_clob;
  名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ID                                      NOT NULL NUMBER(3)
 CLOBCOL                                            CLOB

要查询其中的内容, 则要把 $oracle/ora90/oo4o/CPP/LIB/ORACLM32.LIB 文件加到工程中, 然后下面的程序演示了如何读上面的 clobcol 字段:
----------------------------------------------------------
// OraConsole.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "oracl.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
OStartup();
// 下面输入数据库名, 用户名, 密码
ODatabase odb("YourDatabase", "YourUser", "YourPasspord");
ODynaset odyn(odb, "select * from test_clob");

if (!odyn.IsOpen())
{
cout << "Connect Error: " << odb.GetErrorText() << endl;
cout << "SQL Error: " << odyn.GetErrorText() << endl;
return 1;
}

OClob oclob;
odyn.GetFieldValue("clobcol", &oclob);

unsigned char *buffer = 0;
try
{
unsigned long size = oclob.GetSize();

buffer = (unsigned char *)malloc(size);
memset(buffer, 0, size);
oclob.EnableStreaming(size);
short status = OLOB_NEED_DATA;
unsigned long amtread = 0;
while (status == OLOB_NEED_DATA)
{
                 // 下面是把数据读到 buffer 中
amtread = oclob.Read(&status, buffer, size);
}
oclob.DisableStreaming();
}
catch(OException E)
{
 cout << E.GetFailedMethodName() << " Error: " << E.GetErrorText() << endl;
}
if (buffer)
free(buffer);

return 0;
}
----------------------------------------------------------
详情参看 $oracle/ora90/oo4o/CPP/WORKBOOK/LOB 目录里的 CLOBREAD.CPP

原创粉丝点击