最近在用vc6开发一个控制台程序连接oracle数据库,程序编译通过,但运行是,创建_ConnectionPtr时总是创建不成功,现终于找到了问题所在,下面是测试成功的代码。
#include <iostream>
#include <afx.h>
#include "main.h"
//#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("EOF","adoEOF")
using namespace std;
void main()
{
::CoInitialize(NULL);
_ConnectionPtr myConn;
myConn.CreateInstance("ADODB.Connection");
//微软提供连接字符串
char strConn[] = {"Provider=MSDAORA;Data Source=oracle;User ID=system; Password=zjzjzh;"};
HRESULT hr = myConn->Open((_bstr_t)strConn,"","",adConnectUnspecified);
if(FAILED(hr))
{
//AfxMessageBox("连接数据库错误");
cout<<"连接数据库错误"<<endl;
return;
}
//打开一个连接
_RecordsetPtr myRecord;
myRecord.CreateInstance("ADODB.Recordset");
//打开结果集
myRecord->Open("SELECT * FROM HR.JOBS",myConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
//操作结果集
VARIANT var;
VariantInit(&var);
CString strJobId;
while(myRecord->adoEOF == FALSE)
{
var = myRecord->GetCollect("JOB_ID");
if(var.vt != VT_NULL)
{
strJobId = (LPCSTR)(_bstr_t)var;
//AfxMessageBox(strJobId);
cout<<strJobId.GetBuffer(strJobId.GetLength())<<endl;
myRecord->MoveNext();
}
}
//结构使用完成关闭结果集
if(myRecord->State == TRUE)
{
myRecord->Close();
}
myRecord = NULL;
//关闭数据库连接
if(myConn->State == TRUE)
{
myConn->Close();
}
myConn = NULL;
CoUninitialize();
}
问题出在,在初始化ole库的时候,不能使用afxoleinit函数,要用CoInitialize,否则在下面的创建连接和结果集对象都会创建不成功。
另:1、若要在控制台程序中加入mfc的的非ui类,可以包含afx。h头文件,并在项目设置的编译选项里选择/MD选项就可以了,
2、若包含了iostream头文件,则引入语句一定要在using namespace std的前面,否则编译的时候会出现错误。
以上是我在开发oracle程序的时候的一些体会,希望对大家有所帮助。
开发mfc的程序没有这样的问题。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zjwhcn/archive/2009/06/03/4239414.aspx