C++连接Oracle之ADO

来源:互联网 发布:linux 打开控制台 编辑:程序博客网 时间:2024/06/06 09:34

最近因为项目的需要,要将一些获取到的数据存入Oracle数据库中,可能以前接触的数据库这一块比较少,没有在项目中使用过,所以就查找一些资料,将这几天的成果做一下记录。

 

环境:windows7 64bit

IDE :VS 2010

服务端:winserver2008  Oracle 12c

                          ADO连接(微软的)

两种连接Oracle方法:

                                          OCCI连接(Oracle自己的)

说明:我都是采用客户端连接的方式,即数据库部署在数据库服务器上,我在另一台机器上作为客户端调试程序访问数据库。

本节先说ADO连接,OCCI方式在下一节讨论,ADO接口是微软开发并提供的,目的是简化对程序的工作,方便程序员开发,对底层的数据库操作API进行封装,ADO的易用性很高,这也是为什么现在很多教程都用ADO来讲解数据库的应用了。不过,换个角度想,ADO的效率相对来讲就比较低了。

首先我要利用已有的客户端工具SQL Developer验证,数据库是否可用。


填入必要的连接名,用户名,口令,主机名,端口,SID等信息后,点测试,显示成功。

 

源码部分参考了http://blog.chinaunix.net/uid-26790551-id-3193999.html的内容

stdafx.h

//stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件// #pragma once//#include"targetver.h"#include <stdio.h>#include <tchar.h>//TODO:  在此处引用程序需要的其他头文件

DBOperation.h

#pragma once #import "C:\ProgramFiles\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") class CDBOperation{public:    //初始化数据库操作需要的对象    CDBOperation(void);    ~CDBOperation(void);    //连接至数据库    boolConnToDB(char *ConnectionString,char *UserID, char*Password);     //数据库操作函数    //查询操作删除以及添加    _RecordsetPtr ExecuteWithResSQL(constchar *);    //boolExecuteNoResSQL(const char *);//delete and add private:    voidPrintErrorInfo(_com_error &); private:    //初始化数据库连接、命令、记录集    _ConnectionPtr CreateConnPtr();    _CommandPtr CreateCommPtr();    _RecordsetPtr CreateRecsetPtr(); private:    //数据库连接需要的连接、命令操作对象    _ConnectionPtr m_pConnection;    _CommandPtr m_pCommand;};


DBOperation.cpp

#include "stdafx.h"#include "DBOperation.h" CDBOperation::CDBOperation(void){    CoInitialize(NULL);    m_pConnection = CreateConnPtr();    m_pCommand = CreateCommPtr();} CDBOperation::~CDBOperation(void){    //m_pCommand->Close();    m_pConnection->Close();} bool CDBOperation::ConnToDB(char*ConnectionString,char *UserID, char *Password){    if (NULL ==m_pConnection)    {        printf("Failedto create connection\n");        return false;    }     try    {        HRESULT hr =m_pConnection->Open(ConnectionString, UserID, Password, NULL);        if (TRUE== FAILED(hr))        {            returnfalse;        }        m_pCommand->ActiveConnection =m_pConnection;        return true;    }    catch(_com_error &e)    {        PrintErrorInfo(e);        return false;    }} _RecordsetPtrCDBOperation::ExecuteWithResSQL(constchar *sql){    //已经在连接至数据库的时候进行判断了    //if (NULL ==m_pCommand || 0 == m_pConnection->State)    //{    //    printf("Failed to create command ORthe state of connection is zero\n");    //    return NULL;    //}     //char *query =new char;    //strcpy(query,sql);    try    {        m_pCommand->CommandText =_bstr_t(sql);        _RecordsetPtr pRst =m_pCommand->Execute(NULL, NULL, adCmdText);        returnpRst;        //_variant_tra;        //_RecordsetPtrpRst = m_pConnection->Execute((_bstr_t)query, &ra, adCmdText);    }    catch(_com_error &e)    {        PrintErrorInfo(e);        returnNULL;    }} //boolCDBOperation::ExecuteNoResSQL(const char *sql)//{//    //if (NULL == m_pCommand || 0 ==m_pConnection->State)//    //{//    //   printf();//    //}//    try//    {//        char *query = NULL;//        strcpy(query, sql);//        m_pCommand->CommandText =(_bstr_t)query;////    }//} void CDBOperation::PrintErrorInfo(_com_error &e){    printf("Errorinfomation are as follows\n");    printf("ErrorNo:%d\nError Message:%s\nError Source:%s\nError Description:%s\n",e.Error(), e.ErrorMessage(), (LPCTSTR)e.Source(), (LPCTSTR)e.Description());} _ConnectionPtrCDBOperation::CreateConnPtr(){    HRESULT hr;    _ConnectionPtr connPtr;    hr = connPtr.CreateInstance(__uuidof(Connection));    if(FAILED(hr) == TRUE)    {        returnNULL;    }    returnconnPtr;} _CommandPtrCDBOperation::CreateCommPtr(){    HRESULT hr;    _CommandPtr commPtr;    hr = commPtr.CreateInstance(__uuidof(Command));    if(FAILED(hr) == TRUE)    {        returnNULL;    }    returncommPtr;} _RecordsetPtrCDBOperation::CreateRecsetPtr(){    HRESULT hr;    _RecordsetPtr recsetPtr;    hr = recsetPtr.CreateInstance(__uuidof(Command));    if(FAILED(hr) == TRUE)    {        returnNULL;    }    returnrecsetPtr;}

main.cpp

#include "DBOperation.h"#include <iostream>using namespace std; void main(){    CDBOperation dbOper;       bool bConn=dbOper.ConnToDB("Provider=OraOLEDB.Oracle;Password = abc;Persist Security Info=True;User ID=COMPETITION;DataSource=\"(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.26.51)(PORT = 1521)) )(CONNECT_DATA = (SID =RESOURCECENT)))\"","COMPETITION","123");    if (false == bConn)    {        printf("连接数据库出现错误\n");        system("PAUSE");        return;    }    printf("连接数据库成功!\n");    _RecordsetPtr pRst;     //执行查询语句    //char *sql ="select * from TSTUDENT";    charsql[255] = { 0 };    strcpy_s(sql, "select* from TABLETEST");    pRst = dbOper.ExecuteWithResSQL(sql);    if (NULL ==pRst)    {        printf("查询数据出现错误!\n");        system("PAUSE");        return;    }    if(pRst->adoEOF)    {        pRst->Close();        printf("Thereis no records in this table\n");        system("PAUSE");        return;    }    printf("正在查询...\n");    _variant_t vSno, vName, vAge, vDno, vDname,vCname;    while(!pRst->adoEOF)    {        //pRst->MoveFirst();//记录集指针移动到查询结果集的前面        vSno = pRst->GetCollect(_variant_t((long)0));        vName = pRst->GetCollect(_variant_t("name"));        vDname = pRst->GetCollect(_variant_t("sex"));        vAge = pRst->GetCollect(_variant_t("age"));        //vDno =pRst->GetCollect("dno");        //vDname =pRst->GetCollect("dname");        //vCname =pRst->GetCollect("cname");         printf("%s\t%s\t%s\t%d\n",(LPSTR)(LPCSTR)(_bstr_t)vSno, (LPSTR)(LPCSTR)_bstr_t(vName),(LPSTR)(LPCSTR)_bstr_t(vDname), vAge.intVal);        pRst->MoveNext();    }     //执行插入语句    strcpy_s(sql, "insertinto TABLETEST(sno, name, sex, age) values('20080004', '阿里巴巴', '男', 32)");    pRst = dbOper.ExecuteWithResSQL(sql);    if (NULL !=pRst)    {        printf("插入数据成功\n");    }    //执行删除语句     sprintf_s(sql, "deletefrom TABLETEST where sno = '%s'","20080002");    pRst = dbOper.ExecuteWithResSQL(sql);    if (NULL !=pRst)    {        printf("删除数据成功\n");    }    system("PAUSE");    //pRst->Close();}


完成后编译运行总是报错:


网上查资料后,看到有人遇到类似的问题,


然后x64编译,通过运行,成功。


 

错误异常

1.      调试正常的程序,不知道系统环境那里做了修改,过几天运行又报错。

ADO连接数据库运行x64,编译报错

OraOLEDBpus12.dll:找不到指定模块(配图是网上找的)


在Oracle安装目录找到F:\app\Oracle\product\12.1.0\dbhome_1\BIN

OraOLEDBpus12.dll文件放入C:\Windows\System32目录

这时,新的错误又出现了OraOLEDB12us.dll


解决: 同上,把OraOLEDB12us.dll 拷到系统盘:\Windows\system32\


2.       程序调试完毕,换到其他人的电脑运行程序,有的机器正常,有的会运行报错0xc000007b:


查找是缺少部分.dll库支持,使用DirectX  Repair工具。


修复后,重启电脑,程序可运行。

0 0
原创粉丝点击