用 C++ 读取 Oracle CLOB 数据

来源:互联网 发布:淘宝灯饰排名 编辑:程序博客网 时间:2024/05/16 01:12

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,0not 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 文件.

原创粉丝点击