DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

 在VC中访问Oracle,可以使用ADO或ODBC,如果你比较强大,也可以直接使用OCI API,但我个人认为OTL是最佳选择,它是一套数据库访问C++模板库,全部代码都在otlv4.h头文件中,通过OTL不但可以访问Oracle数据库(使用OCI  API),还可以访问DB2,或者使用ODBC连接字符串访问其他数据库。

 

     otl的源码只有一个头文件——otlv4.h。下面以一个例子来说明如何使用otl。

  1. #define OTL_ORA10G  
  2. #include <otlv4.h>  
  3. void CAboutDlg::OnBnClickedOk()  
  4. {  
  5.     // TODO: 在此添加控件通知处理程序代码  
  6.     otl_connect OracleDb;  // 定义一个oracle数据库的连接对象  
  7.    
  8.     OracleDb.otl_initialize(TRUE);// 以线程安全模式初始化OCI环境   
  9.   
  10.     std::string szConnectString = _T("system/zjc@ORCL");    
  11.   
  12.     try    
  13.     {   
  14.         // 连接数据库  
  15.         OracleDb.rlogon(szConnectString.c_str(),1);   
  16.         // 查询数据库中所有用户  
  17.         std::string strSql = _T("select username from dba_users");    
  18.         otl_stream i(1024, // buffer size    
  19.             strSql.c_str(),    
  20.             OracleDb // connect object    
  21.             );    
  22.   
  23.         int nNumUser = 0 ;  
  24.         TCHAR szNum[64];   
  25.         while(!i.eof())// while not end-of-data    
  26.         {  
  27.             i>>szNum; //获取单个用户名  
  28.             nNumUser++;  
  29.         }  
  30.         CString strNum;  
  31.         strNum.Format(("当前oracle数据库用户个数为:%d"),nNumUser);  
  32.         AfxMessageBox(strNum);  
  33.     }    
  34.     catch (otl_exception& p)    
  35.     {    
  36.         TRACE(_T("Oracle connecterror(msg:%s, stm_text: %s, sqlstate: %s, var_info: %s)"), p.msg, p.stm_text, p.sqlstate, p.var_info);    
  37.     }    
  38.   
  39.     OnOK();  
  40. }  

       代码在WinXp+ sp2, VS 2008 + sp1,oracle 10gr2环境下测试通过。上面代码例子连接Oracle数据库用到了rlogon()函数,调用它时需要为它提供一个连接字符串,一般是这样的:

[User Name]/[Password]@[TNS Alias]

    

        这里的TNS Alias指在tnsnames.ora中配置TNS名,比如我的tnsnames.ora里有以下的配置:

  1. # tnsnames.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora  
  2. # Generated by Oracle configuration tools.  
  3.   
  4. ORCL =  
  5.   (DESCRIPTION =  
  6.     (ADDRESS = (PROTOCOL = TCP)(HOST = zjc)(PORT = 1521))  
  7.     (CONNECT_DATA =  
  8.       (SERVER = DEDICATED)  
  9.       (SERVICE_NAME = orcl)  
  10.     )  
  11.   )  
  12.   
  13. EXTPROC_CONNECTION_DATA =  
  14.   (DESCRIPTION =  
  15.     (ADDRESS_LIST =  
  16.       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))  
  17.     )  
  18.     (CONNECT_DATA =  
  19.       (SID = PLSExtProc)  
  20.       (PRESENTATION = RO)  
  21.     )  
  22.   )  

    那么TNS Alias就是ORCL。 

    此外需要注意的是使用otl连接oracle数据库需要链接oci.lib,也就是说需要包含它的头文件和库文件路径。

 

参考文献:

1.     在VC中使用OTL访问Oracle和程序发布

posted on   DoubleLi  阅读(1426)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2012-11-21 assert()函数用法总结 .
2012-11-21 堆和栈的区别(转过无数次的文章) .
2012-11-21 Win32 多线程的创建方法和基本使用 .
2012-11-21 stdcall、cdecl 和pascal简介 .
2012-11-21 windows程序调试
2012-11-21 VS2005设置可以在Release模式下调试 .
2012-11-21 如何在对话框中实现文件拖放功能
点击右上角即可分享
微信分享提示