C++操作oracle数据库

http://blog.chinaunix.net/uid-26790551-id-3193999.html

 

数据库操作方式:可以采用ADO方式,也可以采用oracle本身提供的Proc*C/C++或者是OCCI方式操作数据库。

  连接方式:可以是客户端连接、也可以是服务器端连接。

  数据库配置:无论是何种连接都需要进行数据库连接的配置,一般在ORACLE_HOME下面的network/admin/tnsnames.ora文件中进行配置,如果没有此目录或者是此文件,需要自己手工添加。内容格式大致如下:

点击(此处)折叠或打开

  1. BM2D0 =
  2.   (DESCRIPTION =
  3.     (ADDRESS_LIST =
  4.       (ADDRESS = (PROTOCOL = TCP)(HOST = XXX.XXX.XXX.XXX)(PORT = 1521))
  5.     )
  6.     (CONNECT_DATA =
  7.       (SERVICE_NAME = BM2D0)
  8.     )
  9.   )

其中橄榄色可任意起名,一般在数据库连接是作为服务和用户名、密码一起确定数据库连接的参数。

    第一个鲜粉色是远程oracle数据库所在服务器的IP地址,端口号一般为1521。

    第二个鲜粉色是远程oracle所在主机的全局数据库名字,不能随意更改。

    后两个搭配起来能够确定唯一连接对象。
客户端连接:

方式一:ADO

main.cpp

 

点击(此处)折叠或打开

  1. #include "DBOperation.h"
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. void main()
  6. {
  7.     CDBOperation dbOper;
  8.     bool bConn = dbOper.ConnToDB("Provider=OraOLEDB.Oracle.1;Persist Security Info=True;Data Source=xxx1", "xxx2", "xxx3");
  9.     if (false == bConn)
  10.     {
  11.         printf("连接数据库出现错误\n");
  12.         system("PAUSE");
  13.         return;
  14.     }
  15.  
  16.     _RecordsetPtr pRst;
  17.  
  18.     //执行查询语句
  19.     //char *sql = "select * from TSTUDENT";
  20.     char sql[255] = {0};
  21.     strcpy(sql, "select * from TSTUDENT");
  22.     pRst = dbOper.ExecuteWithResSQL(sql);
  23.     if (NULL == pRst)
  24.     {
  25.         printf("查询数据出现错误!\n");
  26.         system("PAUSE");
  27.         return;
  28.     }
  29.     if (pRst->adoEOF)
  30.     {
  31.         pRst->Close();
  32.         printf("There is no records in this table\n");
  33.         return;
  34.     }
  35.     _variant_t vSno, vName, v***, vAge, vDno, vDname, vCname;
  36.     while (!pRst->adoEOF)
  37.     {
  38.         //pRst->MoveFirst(); //记录集指针移动到查询结果集的前面
  39.         vSno = pRst->GetCollect(_variant_t((long)0));
  40.         vName = pRst->GetCollect(_variant_t("name"));
  41.         v*** = pRst->GetCollect(_variant_t("***"));
  42.         vAge = pRst->GetCollect(_variant_t("age"));
  43.         //vDno = pRst->GetCollect("dno");
  44.         //vDname = pRst->GetCollect("dname");
  45.         //vCname = pRst->GetCollect("cname");
  46.  
  47.         printf("%s\t%s\t%s\t%d\n", (LPSTR)(LPCSTR)(_bstr_t)vSno, (LPSTR)(LPCSTR)_bstr_t(vName), (LPSTR)(LPCSTR)_bstr_t(v***), vAge.intVal);
  48.         pRst->MoveNext();
  49.     }
  50.     
  51.     //执行插入语句
  52.     //sprintf(sql, "insert into TSTUDENT(sno, name, ***, age) values('%s', '%s', '%s', %d)", "20080016", "全局", "女", 25);
  53.     strcpy(sql, "insert into TSTUDENT(sno, name, ***, age) values('20080001', '全局', '女', 25)");
  54.     pRst = dbOper.ExecuteWithResSQL(sql);
  55.     if (NULL != pRst)
  56.     {
  57.         printf("插入数据成功\n");
  58.     }
  59.     //执行删除语句
  60.     
  61.     sprintf(sql, "delete from TSTUDENT where sno = '%s'", "20080017");
  62.     pRst = dbOper.ExecuteWithResSQL(sql);
  63.     if (NULL != pRst)
  64.     {
  65.         printf("删除数据成功\n");
  66.     }
  67.     system("PAUSE");
  68.     //pRst->Close();
  69. }


其中XXX1:是tnsnames.ora中配置的服务名,XXX2是用户名,XXX3是密码。

DBOperation.h:

 

点击(此处)折叠或打开

  1. #pragma once
  2. #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
  3. class CDBOperation
  4. {
  5. public:
  6.     //初始化数据库操作需要的对象
  7.     CDBOperation(void);
  8.     ~CDBOperation(void);
  9.     //连接至数据库
  10.     bool ConnToDB(char *ConnectionString, char *UserID, char *Password);
  11.  
  12.     //数据库操作函数
  13.     //查询操作 删除以及添加
  14.     _RecordsetPtr ExecuteWithResSQL(const char *);
  15.     //bool ExecuteNoResSQL(const char *);//delete and add
  16.  
  17. private:
  18.     void PrintErrorInfo(_com_error &);
  19.  
  20. private:
  21.     //初始化数据库连接、命令、记录集
  22.     _ConnectionPtr CreateConnPtr();
  23.     _CommandPtr CreateCommPtr();
  24.     _RecordsetPtr CreateRecsetPtr();
  25.  
  26. private:
  27.     //数据库连接需要的连接、命令操作对象
  28.     _ConnectionPtr m_pConnection;
  29.     _CommandPtr m_pCommand;
  30. };


DBOperation.cpp

点击(此处)折叠或打开

  1. #include "DBOperation.h"
  2.  
  3. CDBOperation::CDBOperation(void)
  4. {
  5.     CoInitialize(NULL);
  6.     m_pConnection = CreateConnPtr();
  7.     m_pCommand = CreateCommPtr();
  8. }
  9.  
  10. CDBOperation::~CDBOperation(void)
  11. {
  12.     //m_pCommand->Close();
  13.     m_pConnection->Close();
  14. }
  15.  
  16. bool CDBOperation::ConnToDB(char *ConnectionString, char *UserID, char *Password)
  17. {
  18.     if (NULL == m_pConnection)
  19.     {
  20.         printf("Failed to create connection\n");
  21.         return false;
  22.     }
  23.  
  24.     try
  25.     {
  26.         HRESULT hr = m_pConnection->Open(ConnectionString, UserID, Password, NULL);
  27.         if (TRUE == FAILED(hr))
  28.         {
  29.             return false;
  30.         }
  31.         m_pCommand->ActiveConnection = m_pConnection;
  32.         return true;
  33.     }
  34.     catch(_com_error &e)
  35.     {
  36.         PrintErrorInfo(e);
  37.         return false;
  38.     }
  39. }
  40.  
  41. _RecordsetPtr CDBOperation::ExecuteWithResSQL(const char *sql)
  42. {
  43.     //已经在连接至数据库的时候进行判断了
  44.     //if (NULL == m_pCommand || 0 == m_pConnection->State)
  45.     //{
  46.     //    printf("Failed to create command OR the state of connection is zero\n");
  47.     //    return NULL;
  48.     //}
  49.  
  50.     //char *query = new char;
  51.     //strcpy(query, sql);
  52.     try
  53.     {
  54.         m_pCommand->CommandText = _bstr_t(sql);
  55.         _RecordsetPtr pRst = m_pCommand->Execute(NULL, NULL, adCmdText);
  56.         return pRst;
  57.         //_variant_t ra;
  58.         //_RecordsetPtr pRst = m_pConnection->Execute((_bstr_t)query, &ra, adCmdText);
  59.     }
  60.     catch(_com_error &e)
  61.     {
  62.         PrintErrorInfo(e);
  63.         return NULL;
  64.     }
  65. }
  66.  
  67. //bool CDBOperation::ExecuteNoResSQL(const char *sql)
  68. //{
  69. //    //if (NULL == m_pCommand || 0 == m_pConnection->State)
  70. //    //{
  71. //    //    printf();
  72. //    //}
  73. //    try
  74. //    {
  75. //        char *query = NULL;
  76. //        strcpy(query, sql);
  77. //        m_pCommand->CommandText = (_bstr_t)query;
  78. //
  79. //    }
  80. //}
  81.  
  82. void CDBOperation::PrintErrorInfo(_com_error &e)
  83. {
  84.     printf("Error infomation are as follows\n");
  85.     printf("ErrorNo: %d\nError Message:%s\nError Source:%s\nError Description:%s\n", e.Error(), e.ErrorMessage(), (LPCTSTR)e.Source(), (LPCTSTR)e.Description());
  86. }
  87.  
  88. _ConnectionPtr CDBOperation::CreateConnPtr()
  89. {
  90.     HRESULT hr;
  91.     _ConnectionPtr connPtr;
  92.     hr = connPtr.CreateInstance(__uuidof(Connection));
  93.     if (FAILED(hr) == TRUE)
  94.     {
  95.         return NULL;
  96.     }
  97.     return connPtr;
  98. }
  99.  
  100. _CommandPtr CDBOperation::CreateCommPtr()
  101. {
  102.     HRESULT hr;
  103.     _CommandPtr commPtr;
  104.     hr = commPtr.CreateInstance(__uuidof(Command));
  105.     if (FAILED(hr) == TRUE)
  106.     {
  107.         return NULL;
  108.     }
  109.     return commPtr;
  110. }
  111.  
  112. _RecordsetPtr CDBOperation::CreateRecsetPtr()
  113. {
  114.     HRESULT hr;
  115.     _RecordsetPtr recsetPtr;
  116.     hr = recsetPtr.CreateInstance(__uuidof(    Command));
  117.     if (FAILED(hr) ==TRUE)
  118.     {
  119.         return NULL;
  120.     }
  121.     return recsetPtr;
  122. }


方式二:OCCI

默认oracle安装了occi库,但是只是安装了release版本的资源,因此需要将程序配置为release模式,或者是参看http://www.189works.com/article-42057-1.html为debug模式获取必备的头文件以及库文件,本文采用的是release模式,使用默认安装的库文件以及头文件。

1.修改配置属性

    改为Rlease模式

2.添加库文件目录

    $(ORACLE_HOME)\oci\include

3.添加头文件目录

    $(ORACLE_HOME)\oci\lib

4.添加库文件:oraocci10.lib

应用程序:

 

点击(此处)折叠或打开

  1. //代码的目的就是验证makefile中oracle的头文件和lib文件路径是否正确了
  2. #include <iostream>
  3. #define WIN32COMMON //避免函数重定义错误
  4. #include <occi.h>
  5. using namespace std;
  6. using namespace oracle::occi;
  7. int main()
  8. {
  9.   Environment *env=Environment::createEnvironment();
  10.   cout<<"success"<<endl;
  11.   string name = "xxx";
  12.   string pass = "xxx";
  13.   string srvName = "xxx";
  14.  
  15.   try
  16.   {
  17.     Connection *conn = env->createConnection("bsm3", "bsm3", "BSM3");
  18.     cout<<"conn success"<<endl;
  19.     env->terminateConnection(conn);
  20.   }
  21.   catch(SQLException e)
  22.   {
  23.     cout<<e.what()<<endl;
  24.     system("pause");
  25.     return -1;
  26.   }
  27.  
  28.   Environment::terminateEnvironment(env);
  29.   cout<<"end!"<<endl;
  30.   system("pause");
  31.   return 0;
  32. }


服务器端:AIX服务器

方式一:OCCI

helloworld.cpp

 

点击(此处)折叠或打开

  1. //代码的目的就是验证makefile中oracle的头文件和lib文件路径是否正确了
  2. #include <iostream>
  3. #include <occi.h>
  4. using namespace std;
  5. using namespace oracle::occi;
  6. main()
  7. {
  8.   Environment *env=Environment::createEnvironment();
  9.   cout<<"success"<<endl;
  10.   string name = "xxx";
  11.   string pass = "xxx";
  12.   string srvName = "xxx";
  13.  
  14.   try
  15.   {
  16.     Connection *conn = env->createConnection(name, pass, srvName);
  17.     cout<<"conn success"<<endl;
  18.     env->terminateConnection(conn);
  19.   }
  20.   catch(SQLException e)
  21.   {
  22.     cout<<e.what()<<endl;
  23.   }
  24.  
  25.   Environment::terminateEnvironment(env);
  26.   cout<<"end!"<<endl;
  27. }


Makefile:

 

点击(此处)折叠或打开

  1. ###########################################
  2. #Makefile for the OCCI demo programs
  3. ###########################################
  4. INC=-I${ORACLE_HOME}/precomp/public -I${ORACLE_HOME}/rdbms/public
  5. LIB=-L${ORACLE_HOME}/lib -locci #-bnoquiet #-bloadmap
  6. FLAGS=-q64 -g
  7. #为方便取下面三个变量,目标为helloworld,源文件是helloworld.cpp,编译后文件helloworld.o
  8. PRG=helloworld
  9. SRC=helloworld.cpp
  10. OBJ=helloworld.o
  11. #下面是常规的makefile内容,$@表示依次取目标执行,这里只有helloworld一个目标。实际等价于
  12. #CC -o helloworld helloworld.o 不过加入了include和lib文件。而helloworld.o需要后续完成
  13. $(PRG):$(OBJ)
  14.         @echo "begin link......"
  15.         ${CC} ${FLAGS} ${INC} ${LIB} -o $@ $(OBJ)
  16. #helloworld目标依赖helloworld.o生成,所以该句就是编译.c生成.o文件。只不过加入了include和lib文件
  17. $(OBJ):$(SRC)
  18.         @echo "begin compile......"
  19.         ${CC} ${FLAGS} ${INC} ${LIB} -c $(SRC)
  20. #后面的内容不是make的内容了,而是make clean内容。比如想重新make之前,清除.o等文件,执行make clean语句
  21. #.PRNOY语句表明 clean关键词是个伪目标。make不自动执行。
  22. .PRONY:clean
  23. clean:
  24.         @echo "Removing linked and compiled files....."
  25.         rm -f $(OBJ) $(PRG)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值