vc控制台程序连接oracle关键问题

来源:互联网 发布:c语言关键字解释 编辑:程序博客网 时间:2024/05/16 17:13

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