sgnaw(李逍遥) 2006-12-29
平常写数据库程序的时候, 会用 Microsoft ADO 去做, 因此, 到了 oracle 中经验性的也会这么干, 即用下面的方法去打开 Oracle 数据库中的一个表:
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 来访问各种类型的数据, 太方便了. 用下面三句话就可以打开一个表了:
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
即它是由下面语句创建的:
(
id number ( 3 , 0 ) not null ,
clobcol clob,
primary key (id)
);
要查询其中的内容, 则要把 $oracle/ora90/oo4o/CPP/LIB/ORACLM32.LIB 文件加到工程中, 然后下面的程序可以读上面的 clobcol 字段:
//
#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 文件.