用 C++ 读取 Oracle CLOB 数据

sgnaw(李逍遥) 2006-12-29

平常写数据库程序的时候, 会用 Microsoft ADO 去做, 因此, 到了 oracle 中经验性的也会这么干, 即用下面的方法去打开 Oracle 数据库中的一个表:

_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance(__uuidof(Connection));
m_pConnection
-> Open((_bstr_t) " Provider=OraOLEDB.Oracle.1;Data Source=yourDatabase; "
        szUserName, szPassword, adModeUnknown);
//  ...
_RecordsetPtr m_pRecordset;
const  TCHAR  * strSQL  =  _T( " select * from test_clob " );
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset
-> Open((_variant_t)strSQL,
    m_pConnection.GetInterfacePtr(),
    adOpenDynamic,
    adLockOptimistic,
    adCmdText);

原来可以有另一种更简单的选择. 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

即它是由下面语句创建的:

create   table  test_clob 
(
   id            
number ( 3 , 0 not   null ,
   clobcol       clob,
   
primary   key  (id)
);

要查询其中的内容, 则要把 $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)
        
{
            amtread 
= oclob.Read(&status, buffer, size);
            cout 
<< "---------------------------------" << endl << endl;
            cout 
<< buffer << endl << endl;
        }

        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 文件.

要运行上面的程序, 只需要在 Visual C++ 中创建一个 Win32 控制台应用程序, 并加入上面的程序即可. 如果若想添加数据到这个表中, 可以参考 $oracle/ora90/oo4o/CPP/WORKBOOK/LOB/CLOBWRITE.CPP 文件.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值