OTL使用总结
在VC中访问Oracle,可以使用ADO或ODBC,如果你比较强大,也可以直接使用OCI API,但我个人认为OTL是最佳选择,它是一套数据库访问C++模板库,全部代码都在otlv4.h头文件中,通过OTL不但可以访问Oracle数据库(使用OCI API),还可以访问DB2,或者使用ODBC连接字符串访问其他数据库。
otl的源码只有一个头文件——otlv4.h。下面以一个例子来说明如何使用otl。
- #define OTL_ORA10G
- #include <otlv4.h>
- void CAboutDlg::OnBnClickedOk()
- {
- // TODO: 在此添加控件通知处理程序代码
- otl_connect OracleDb; // 定义一个oracle数据库的连接对象
- OracleDb.otl_initialize(TRUE);// 以线程安全模式初始化OCI环境
- std::string szConnectString = _T("system/zjc@ORCL");
- try
- {
- // 连接数据库
- OracleDb.rlogon(szConnectString.c_str(),1);
- // 查询数据库中所有用户
- std::string strSql = _T("select username from dba_users");
- otl_stream i(1024, // buffer size
- strSql.c_str(),
- OracleDb // connect object
- );
- int nNumUser = 0 ;
- TCHAR szNum[64];
- while(!i.eof())// while not end-of-data
- {
- i>>szNum; //获取单个用户名
- nNumUser++;
- }
- CString strNum;
- strNum.Format(("当前oracle数据库用户个数为:%d"),nNumUser);
- AfxMessageBox(strNum);
- }
- catch (otl_exception& p)
- {
- TRACE(_T("Oracle connecterror(msg:%s, stm_text: %s, sqlstate: %s, var_info: %s)"), p.msg, p.stm_text, p.sqlstate, p.var_info);
- }
- OnOK();
- }
代码在WinXp+ sp2, VS 2008 + sp1,oracle 10gr2环境下测试通过。上面代码例子连接Oracle数据库用到了rlogon()函数,调用它时需要为它提供一个连接字符串,一般是这样的:
[User Name]/[Password]@[TNS Alias]
这里的TNS Alias指在tnsnames.ora中配置TNS名,比如我的tnsnames.ora里有以下的配置:
- # tnsnames.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora
- # Generated by Oracle configuration tools.
- ORCL =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = zjc)(PORT = 1521))
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = orcl)
- )
- )
- EXTPROC_CONNECTION_DATA =
- (DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
- )
- (CONNECT_DATA =
- (SID = PLSExtProc)
- (PRESENTATION = RO)
- )
- )
那么TNS Alias就是ORCL。
此外需要注意的是使用otl连接oracle数据库需要链接oci.lib,也就是说需要包含它的头文件和库文件路径。
参考文献:
OTL使用总结的更多相关文章
- debian C++ OTL库 用 unixodbc 连接 mysql 小记
这个东东也是折腾了几天,网上很多文章可能已经过时,所以写下不同,以备后用. 参考网址: http://blog.csdn.net/genganpeng/article/details/7402229 ...
- 使用otl,报错:mysql Commands out of sync; you can't run this command now
1.代码如下: void TestCache(otl_connect& otlConn) { try { ] = {}; sprintf(sql,"call test1(1)&quo ...
- otl插入数据不成功
原因是:void rlogon(...); 没有设置auto_commit为1,otl不会自动提交. 注意:static int otl_initialize (const int threaded_ ...
- 用otl写的oracle取数工具,执行传入在查询语句,把结果输出到文件
项目中经常需要用到此类型的工具 #pragma warning (disable:4786) #include <iostream> #include <map> #inclu ...
- otl获得sql出错位置(oracle)
项目的一个需要,要获得sql出错的位置,从而给出类似sqlplus的错误提示(如下) sql出错原因易获得,记录在otl_exception::msg,但出错位置就不是那么容易了. 默认情况下otl异 ...
- otl库(以前不知道有这个库,并且还可以在Unix下使用)
OTL介绍:OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++编译中操控关系数据库的模板库,它目前几乎支持所有的当前各种主流数据库,例 ...
- Linux下一个OTL 采用long long类型数据库支持BIGINT
码如下面: #define OTL_BIGINT long long #define OTL_STR_TO_BIGINT(str,n) \ { \ n=atoll(str); \ } #define ...
- The Linux Mint 18.1:Eclipse Run The C++ And Python ConfigorationWhen You achieve above step,you can run the c++ and python! (Next OTL ,PYOTL is Project That Write By Ruimin Shen(ability man) )
# Copyright (c) 2016, 付刘伟 (Liuwei Fu)# All rights reserved.# 转载请注明出处 1.Install The Eclipse,g++ Use T ...
- Linux下使用OTL操作mysql数据库
首先重点推荐介绍otl介绍及用法的文章:http://www.cnblogs.com/fnlingnzb-learner/p/5835560.html 一.编写代码 注:以下代码来自OTL示例,略有改 ...
随机推荐
- iOS 根据图片URL从本地相册获取图片
最近做一个聊天的项目,需要发送图片后读取本地图片显示到列表里.刚开始的时候,天真的认为可以用SDWebImage直接加载,然后并不能行. 于是在网上搜了搜,如何根据从相册获取的UIImagePicke ...
- ios不同版本下的UILabel自动换行问题
@interface ThreadPreviewCell : UITableViewCell @property (nonatomic, strong) UILabel *titleLabel; @e ...
- 使用astyle格式化代码【脚本】
astyle使用基础教程 http://cppblog.com/jokes000/articles/158838.html steps: (1) apt-get install astyle 或者去主 ...
- BZOJ 2946: [Poi2000]公共串( 后缀自动机 )
一个串建后缀自动机, 其他串在上面跑, 然后用当前串跑的去更新全部 ------------------------------------------------------------------ ...
- 50句高级SQL语句
一个题目涉及到的50个Sql语句 --(下面表的结构以给出,自己在数据库中建立表.并且添加相应的数据,数据要全面些. 其中Student表中,SId为学生的ID) ------------------ ...
- 【转】CentOS图形界面的开启与关闭
源自:http://blog.sina.com.cn/s/blog_4a1f76860100zpus.html 安装CentOS 5.6系统的时候我没有先装任何组件,现在用X Window,需要再安装 ...
- win7系统中桌面图标显示不正常问题
http://jingyan.baidu.com/article/466506580c9327f549e5f8dc.html 最近笔者在安装软件时,突然出现了桌面图标显示不正常了,一开始还以为是新安装 ...
- django学习之Model(五)MakingQuery
接着上篇. 10-一次更新多个对象 有时想要对QuerySet中的所有对象的某一个field来设定一个值,这时候可以像下边这样用update(): # Update all the headlines ...
- OSG消锯齿
osg::DisplaySettings::instance()->setNumMultiSamples(); 在osg+mfc下成功实现抗锯齿,在程序初始化的时候,即在osg控制类中,我的 ...
- Qt保证只有一个实例(将CreateMutex得到的handle通过转换得到值)
使用CreateMutex 可以实现只启动一个应用程序实例 view plaincopy to clipboardprint?#include <QApplication>#include ...