使用OTL进行数据库编程
2011-09-28 11:27
288 查看
操作环境:
1. 操作系统:Windows XP Professional with SP2。
2. 编程环境:Visual C++ 6.0 with SP6。
3. 数据库环境:Access 2003。
OTL简介:
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++编译中操控关系数据库的模板库,它目前几乎支持所有的当前各种主流数据库,例如Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。OTL中直接操作Oracle主要是通过Oracle提供的OCI接口进行,进行操作DB2数据库则是通过CLI接口来进行,至于MS的数据库和其它一些数据库,则OTL只提供了ODBC来操作的方式。当然Oracle和DB2也可以由OTL间接使用ODBC的方式来进行操纵。
在MS Windows and Unix 平台下,OTL目前支持的数据库版本主要有:Oracle 7 (直接使用 OCI7), Oracle 8 (直接使用 OCI8), Oracle 8i (直接使用OCI8i), Oracle 9i (直接使用OCI9i), Oracle 10g (直接使用OCI10g), DB2 (直接使用DB2 CLI), ODBC 3.x ,ODBC 2.5。OTL最新版本为4.0,参见http://otl.sourceforge.net/,下载地址http://otl.sourceforge.net/otlv4_h.zip。
优点:
a. 跨平台
b. 运行效率高,与C语言直接调用API相当
c. 开发效率高,起码比ADO.net使用起来更简单,更简洁
d. 部署容易,不需要ADO组件,不需要.net framework 等
缺点:
a. 说明文档以及范例不足够丰富(暂时性的)
其实现在它提供有377个使用范例可参考,下载地址:http://otl.sourceforge.net/otl4_examples.zip。
建立数据源
1.依次点击“开始->控制面板”,打开“控制面板”界面,双击“管理工具”,然后再双击“数据源(ODBC)”,就打开了“ODBC数据源管理器”,选择“系统DSN”。
2.单击“添加”,弹出“创建新数据源”对话框,选择“Microsoft Access Driver(*.mdb)”。
3.点击“完成”,弹出“ODBC Microsoft Access安装”对话框,单击“创建”,开始创建数据库,弹出“新建数据库”对话框,添加数据库名称my_db和选择数据库存放目录,单击“确定”,创建完成,然后添加数据源名:my_db。点击“确定”。
4.然后在系统数据源中就有我们刚才添加的数据源。
5.单击“确定”,完成数据源的创建。
OTL编程
下面我们用一个实例来说明:
1. 创建数据表:TestTable ( ColumA int , ColumB varchar(50),ColumC varchar(50) )
2. 插入100条数据,ColumA 为数据的 id 范围:0-99 , ColumB=”Test Data %d” , 其中 %d=id 。
3. 删除表中ColumA 中小于10和大于90的数据。
4. 将ColumA为3的倍数的记录中ColumC更新为ColumB的内容。
具体代码为:
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <iostream>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
using namespace std;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <stdio.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <string.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <stdlib.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#define OTL_ODBC // 编译 OTL 4.0/ODBC
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
// #define OTL_ODBC_UNIX // 如果在Unix下使用UnixODBC,则需要这个宏
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "otlv4.h" // 包含 OTL 4.0 头文件
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
otl_connect db; // 连接对象
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//此函数完成插入100条数据,ComulA为数据的id,范围为0-99,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//ColumB="Test Data %d",其中%d=id
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void insert()
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
// 向表中插入行
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// 打开一个通用的流,以模板的方式向表中插入多项数据
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_stream
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
o(1, // 流的缓冲值必须设置为1-->TODO:JHHE解释:buffersize
为1则输入一条马上插入数据库,若为10则为10条时一起插入库。
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
"insert into TestTable values(:f1<int>,:f2<char[50]>,:f3<char[50]>)",
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// SQL 语句
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
db // 连接对象
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
char tmp1[32];
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
char tmp2[30];
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for(int i=0;i<100;++i){
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
sprintf(tmp1,"Test Data %d",i);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
sprintf(tmp2,"");
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
o<<i<<tmp1<<tmp2;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//此函数完成删除表中ColumA中小于10和大于90的数据
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void delete_rows()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
long rpc=otl_cursor::direct_exec(db,"delete from TestTable where ColumA<10 or ColumA>90");
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// rpc是作用效果的返回值,otl_cursor::direct_exec为直接执行sql语句
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
cout<<"Rows deleted: "<<rpc<<endl;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//此函数完成将ColumA为3的倍数的记录中ColumC更新为ColumB的内容
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void update()
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
// 更新表
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_stream
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
o(1, // 缓冲值
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
"UPDATE TestTable "
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
" SET ColumC=:f2<char[50]> "
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
" WHERE ColumA=:f1<int>",
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// UPDATE 语句
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
db // 连接对象
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_stream c(1,"select ColumB from TestTable where ColumA=:f3<int>",db);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
char temp[10];
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
for(int i=10;i<91;i++)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if(i%3==0)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
c << i;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
c >> temp;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
o << temp << i;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int main()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_connect::otl_initialize(); // 初始化 ODBC 环境
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
db.rlogon("UID=scott;PWD=tiger;DSN=my_db"); // 连接到 ODBC
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//或者使用下面的连接语句方式。
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// db.rlogon("scott/tiger@firebird"); // connect to ODBC, alternative format
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// of connect string
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_cursor::direct_exec
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
(
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
db,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
"drop table TestTable",
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_exception::disabled // disable OTL exceptions
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
); // drop table
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//这里完成表的创建
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_cursor::direct_exec
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
(
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
db,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
"create table TestTable(ColumA int, ColumB varchar(50),ColumC varchar(50))"
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
); // create table
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
insert(); // insert records into the table
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// update(10); // update records in the table
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
delete_rows();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
update();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
catch(otl_exception& p){ // intercept OTL exceptions
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
cerr<<p.msg<<endl; // print out error message
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
cerr<<p.stm_text<<endl; // print out SQL that caused the error
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
cerr<<p.sqlstate<<endl; // print out SQLSTATE message
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
cerr<<p.var_info<<endl; // print out the variable that caused the error
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
db.logoff(); // disconnect from the database
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return 0;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
1. 操作系统:Windows XP Professional with SP2。
2. 编程环境:Visual C++ 6.0 with SP6。
3. 数据库环境:Access 2003。
OTL简介:
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++编译中操控关系数据库的模板库,它目前几乎支持所有的当前各种主流数据库,例如Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。OTL中直接操作Oracle主要是通过Oracle提供的OCI接口进行,进行操作DB2数据库则是通过CLI接口来进行,至于MS的数据库和其它一些数据库,则OTL只提供了ODBC来操作的方式。当然Oracle和DB2也可以由OTL间接使用ODBC的方式来进行操纵。
在MS Windows and Unix 平台下,OTL目前支持的数据库版本主要有:Oracle 7 (直接使用 OCI7), Oracle 8 (直接使用 OCI8), Oracle 8i (直接使用OCI8i), Oracle 9i (直接使用OCI9i), Oracle 10g (直接使用OCI10g), DB2 (直接使用DB2 CLI), ODBC 3.x ,ODBC 2.5。OTL最新版本为4.0,参见http://otl.sourceforge.net/,下载地址http://otl.sourceforge.net/otlv4_h.zip。
优点:
a. 跨平台
b. 运行效率高,与C语言直接调用API相当
c. 开发效率高,起码比ADO.net使用起来更简单,更简洁
d. 部署容易,不需要ADO组件,不需要.net framework 等
缺点:
a. 说明文档以及范例不足够丰富(暂时性的)
其实现在它提供有377个使用范例可参考,下载地址:http://otl.sourceforge.net/otl4_examples.zip。
建立数据源
1.依次点击“开始->控制面板”,打开“控制面板”界面,双击“管理工具”,然后再双击“数据源(ODBC)”,就打开了“ODBC数据源管理器”,选择“系统DSN”。
2.单击“添加”,弹出“创建新数据源”对话框,选择“Microsoft Access Driver(*.mdb)”。
3.点击“完成”,弹出“ODBC Microsoft Access安装”对话框,单击“创建”,开始创建数据库,弹出“新建数据库”对话框,添加数据库名称my_db和选择数据库存放目录,单击“确定”,创建完成,然后添加数据源名:my_db。点击“确定”。
4.然后在系统数据源中就有我们刚才添加的数据源。
5.单击“确定”,完成数据源的创建。
OTL编程
下面我们用一个实例来说明:
1. 创建数据表:TestTable ( ColumA int , ColumB varchar(50),ColumC varchar(50) )
2. 插入100条数据,ColumA 为数据的 id 范围:0-99 , ColumB=”Test Data %d” , 其中 %d=id 。
3. 删除表中ColumA 中小于10和大于90的数据。
4. 将ColumA为3的倍数的记录中ColumC更新为ColumB的内容。
具体代码为:
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <iostream>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
using namespace std;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <stdio.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <string.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <stdlib.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#define OTL_ODBC // 编译 OTL 4.0/ODBC
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
// #define OTL_ODBC_UNIX // 如果在Unix下使用UnixODBC,则需要这个宏
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "otlv4.h" // 包含 OTL 4.0 头文件
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
otl_connect db; // 连接对象
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//此函数完成插入100条数据,ComulA为数据的id,范围为0-99,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//ColumB="Test Data %d",其中%d=id
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void insert()
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
// 向表中插入行
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// 打开一个通用的流,以模板的方式向表中插入多项数据
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_stream
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
o(1, // 流的缓冲值必须设置为1-->TODO:JHHE解释:buffersize
为1则输入一条马上插入数据库,若为10则为10条时一起插入库。
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
"insert into TestTable values(:f1<int>,:f2<char[50]>,:f3<char[50]>)",
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// SQL 语句
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
db // 连接对象
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
char tmp1[32];
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
char tmp2[30];
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for(int i=0;i<100;++i){
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
sprintf(tmp1,"Test Data %d",i);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
sprintf(tmp2,"");
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
o<<i<<tmp1<<tmp2;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//此函数完成删除表中ColumA中小于10和大于90的数据
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void delete_rows()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
long rpc=otl_cursor::direct_exec(db,"delete from TestTable where ColumA<10 or ColumA>90");
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// rpc是作用效果的返回值,otl_cursor::direct_exec为直接执行sql语句
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
cout<<"Rows deleted: "<<rpc<<endl;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//此函数完成将ColumA为3的倍数的记录中ColumC更新为ColumB的内容
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void update()
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
// 更新表
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_stream
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
o(1, // 缓冲值
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
"UPDATE TestTable "
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
" SET ColumC=:f2<char[50]> "
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
" WHERE ColumA=:f1<int>",
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// UPDATE 语句
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
db // 连接对象
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_stream c(1,"select ColumB from TestTable where ColumA=:f3<int>",db);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
char temp[10];
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
for(int i=10;i<91;i++)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if(i%3==0)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
c << i;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
c >> temp;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
o << temp << i;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int main()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_connect::otl_initialize(); // 初始化 ODBC 环境
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
db.rlogon("UID=scott;PWD=tiger;DSN=my_db"); // 连接到 ODBC
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//或者使用下面的连接语句方式。
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// db.rlogon("scott/tiger@firebird"); // connect to ODBC, alternative format
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// of connect string
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_cursor::direct_exec
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
(
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
db,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
"drop table TestTable",
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_exception::disabled // disable OTL exceptions
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
); // drop table
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//这里完成表的创建
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
otl_cursor::direct_exec
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
(
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
db,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
"create table TestTable(ColumA int, ColumB varchar(50),ColumC varchar(50))"
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
); // create table
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
insert(); // insert records into the table
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// update(10); // update records in the table
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
delete_rows();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
update();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
catch(otl_exception& p){ // intercept OTL exceptions
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
cerr<<p.msg<<endl; // print out error message
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
cerr<<p.stm_text<<endl; // print out SQL that caused the error
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
cerr<<p.sqlstate<<endl; // print out SQLSTATE message
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
cerr<<p.var_info<<endl; // print out the variable that caused the error
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
db.logoff(); // disconnect from the database
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return 0;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
相关文章推荐
- 使用OTL进行数据库编程
- 使用OTL进行数据库编程
- 使用OTL进行数据库编程
- 简单使用OTL进行数据库编程
- MFC中使用ADO进行数据库操作 参考FROM:http://hi.baidu.com/sunkanghome/item/e1fda510b3186359f1090ee2 数据库与数据库编程: 当
- 资料--使用java、web services进行数据库编程
- PHP中将对数据库的操作,封装成一个工具类以及学会使用面向对象的方式进行编程
- 使用wamp环境进行数据库编程一定要注意端口问题~
- *Delphi使用ADO进行数据库编程
- 使用PowerDesigner 15对现有数据库进行反向工程图解教程
- 如何使用R语言链接数据库并对数据库中的表进行查询操作
- 手把手教你如何使用Multisim对Digilent FPGA开发板进行编程
- 当前数据库普遍使用wait-for graph等待图来进行死锁检测
- Spring-JDBC:在使用JdbcTemplate进行条件查询时没有返回数据,但是sql直接在数据库中执行是有数据返回的。
- (使用STL自带的排序函数进行编程7.3.14)UVA 10062 Tell me the frequencies!(求一个字符出现的次数(包括字母和数字)&&按出现的次数降序)
- 使用PowerDesigner 15对现有数据库进行反向工程(图解教程)(转)
- 在 Visual C++ 开发环境下使用ADO来进行数据库应用程序开发
- 使用Custom SQL Profiler Trace Template对Microsoft Dynamics CRM数据库操作进行跟踪
- 使用数据泵进行HIS数据库迁移
- 使用postgreSQL DataSync 进行pg数据库升级 数据同步 升级脚本生成, postgreSQL DataSync简单教程