您的位置:首页 > 数据库 > Oracle

用 C++ 读取 Oracle CLOB 数据

2006-12-29 01:15 761 查看
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 文件.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息