最近在用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