OTL实战小结

简介: 以下内容是项目中使用OTL的部分小结,适合OTL初学者。

前言

以下内容是项目中使用OTL的部分小结,适合OTL初学者。大牛请绕行。

一、OTL常用接口说明

1)otl_initialize( OCI_THREADED)
初始化OTL环境。需要在程序最开始连接数据库之前调用一次。参数threaded_mode指明程序是否运行在多线程环境,注意由于OTL并没有使用同步锁或者临界段,线程安全并不能够自动得到保证。

#define OCI_DEFAULT 0x00000000   /* the default value for parameters and attributes */
#define OCI_THREADED 0x00000001  /* appl. in threaded environment */

2)void set_character_set(const int char_set=SQLCS_IMPLICIT);
如果使用了UNICODE,则该方法设置默认或国家的字符集:
SQLCS_IMPLICIT为数据库默认字符集。(默认参数)
SQLCS_NCHAR为数据库国家的字符集。

3)void rlogon(…);
rlogon( “XX/psdXX@110.220.12.33/xe”)
连接数据库。参数同构造函数。
4)void set_max_long_size(const int amax_size);
set_max_long_size(OTL_MAX_LONG_SIZE);
buffer_size参数指明存放大型对象的缓存大小,默认为3276,可以通过otl_connect的set_max_long_size()方法来改变默认的大小值 #define OTL_MAX_LONG_SIZE 80000

5)void auto_commit_off(void); //关闭自动提交
void auto_commit_on(void); //打开自动提交
设置otl_connect对象的auto_commit标志。
一旦关闭了自动连接,意味着所有的提交必须通过commit( )接口实现。

6)void commit(void);
同步的方式提交事务。
void commit_nowait();
异步的方式提交事务。

7)void logoff();
数据库断开。

8)void set_commit(int auto_commit=0);
Set the stream auto-commit flag. When the output buffer is flushed, the current transaction is automatically committed, if the flag is set. By default, the flag is set.

9)void set_batch_error_mode(const bool batch_error_mode)
10)void open(…);
This function open an SQL statement and the statement
gets parsed, all input and output variables get dynamically allocated inside the stream and automatically bound to
the placeholders.

二、VS2010下如何配置

第一步:将OTL需要的lib文件和头文件以文件夹的形式放到工程目录下。
第二步:在工程属性–>配置属性–>C/C++–>附加包含目录下,填写对应头文件相对路径。
第三步:在工程属性–>配置属性–>链接库–>附加库目录下,填写对应lib文件包含的相对路径。
并在附加依赖库中填写oci.lib,oraocci10.lib,ociw32.lib三个依赖库。
第四步:工程中头文件中加入如下的包含:

#define OTL_ORA_TIMESTAMP 
#define OTL_ODBC_TIME_ZONE
#define OTL_ORA10G
#define OTL_ORA_UTF8
#define OTL_STL
#define OTL_ORA_MAP_BIGINT_TO_LONG
#define OTL_BIGINT long long
#define OTL_STREAM_READ_ITERATOR_ON
#define OTL_STL
#define OTL_MAX_LONG_SIZE 100*1024

#include "otl/otlv4.h"

第五步:编写属于自己的OTL代码。

三、OTL源码范例(实现功能:增、删、改、查)

//所有代码在VS2010以及数据库操作都没有Bug。

#include "stdafx.h"
#include "sql.h"
#include <stdio.h>


OtlSql::OtlSql()
{
printf("Constructor!\n");
}

OtlSql::~OtlSql()
{
printf("Destructor!\n");
}

bool OtlSql::sql_init(char* strsql)
{
bool bInitFlag = false;

putenv(const_cast<char*>("NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK"));

otl_connect::otl_initialize();
try
{
db.rlogon(strsql);
}
catch(otl_exception& p)
{
printf("%s\n", p.msg); // print out error message
printf("%s\n", p.stm_text); // print out SQL that caused the error
printf("%s\n", p.var_info); // print out the variable that caused the error
return bInitFlag;
}
bInitFlag = true;
return bInitFlag;
}


void OtlSql::sql_close()
{
db.commit();
db.logoff();
}

//1.插入
void OtlSql::sql_insert(int nNo, int nAge, char* pszName, float fScore)
{
char szSqlInsert[512] = {0};
sprintf(szSqlInsert, "insert into student_info(NO, AGE, NAME, SCORE) \
VALUES(:f0<int>, :f1<int>, :f2<char[50]>, :f3<float>)");

try
{
otl_stream ostream(1, szSqlInsert, db);
ostream << nNo << nAge << pszName << fScore;
ostream.close();
}
catch (otl_exception& excp)
{
printf("Error:%s;\n %s;\n %s.\n", excp.msg, excp.stm_text, excp.var_info);
}

}

//2.删除
void OtlSql::sql_delete(char* pszName)
{
char szSqlDelect[512] = {0};
sprintf(szSqlDelect, "delete from student_info where Name = \'%s\'", pszName);

try
{
otl_stream ostream(1, szSqlDelect, db);
ostream.close();
}
catch (otl_exception& excp)
{
printf("Error:%s;\n %s;\n %s.\n", excp.msg, excp.stm_text, excp.var_info);
}
}

//3更新修改
void OtlSql::sql_update(char* pszName, float fScore)
{
char szSqlUpdate[512] = {0};
sprintf(szSqlUpdate, "update student_info set SCORE = :f3<float> where NAME = \'%s\'", pszName);

try
{
otl_stream ostream(1, szSqlUpdate, db);
ostream << fScore;
ostream.close();
}
catch (otl_exception& excp)
{
printf("Error:%s;\n %s;\n %s.\n", excp.msg, excp.stm_text, excp.var_info);
}
}


//4查询
void OtlSql::sql_select(int nNo)
{
char szSqlSelect[512] = {0};
sprintf(szSqlSelect, "select NAME, SCORE from student_info where NO = %d", nNo);

string strName = "";
float fScore = 0.0f;

try
{
otl_stream ostream(1, szSqlSelect, db);
ostream >> strName >> fScore;
cout << "Name: " << strName.c_str() << "\tScore: " << fScore << endl;
ostream.close();
}
catch (otl_exception& excp)
{
printf("Error:%s;\n %s;\n %s.\n", excp.msg, excp.stm_text, excp.var_info);
}
}

源码详情下载链接:http://download.csdn.net/detail/wojiushiwo987/9351407

四、总结

  1. 毕业2.5年,第一次项目中使用Oracle数据库,之前学习都是SQLServer用的少。
  2. 这篇权当积累。

作者:铭毅天下

转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/50283139

相关文章
|
SQL 数据库连接 数据库
Qt实用技巧:Qt连接SQL Server数据库(需要配置ODBC)
Qt实用技巧:Qt连接SQL Server数据库(需要配置ODBC)
|
5月前
|
SQL 关系型数据库 MySQL
怎么通过第三方库实现标准库`database/sql`的驱动注入?
在Go语言中,数据库驱动通过注入`database/sql`标准库实现,允许统一接口操作不同数据库。本文聚焦于`github.com/go-sql-driver/mysql`如何实现MySQL驱动。`database/sql`提供通用接口和驱动注册机制,全局变量管理驱动注册,`Register`函数负责添加驱动,而MySQL驱动在`init`函数中注册自身。通过这个机制,开发者能以一致的方式处理多种数据库。
|
SQL Java 数据库连接
hyorm框架进阶用法
hyorm框架的原生使用方法,源于php laravel框架的orm层实现方案,基于单Query的设计方式,确保在java多线程中的线程安全性。
72 0
|
SQL 关系型数据库 MySQL
设计模式之Database/SQL与GORM实践|青训营笔记
本篇笔记暂时的定位是以介绍两种方式操作(MySQL)数据库为主,并辅以一些源码的解读帮助大家更好理解数据库连接的过程。
256 0
设计模式之Database/SQL与GORM实践|青训营笔记
|
SQL 缓存 Oracle
OTL实战小结
前言: 以下内容是项目中使用OTL的部分小结,适合OTL初学者。大牛请绕行。
346 0
SQL 笔记(函数)
SQL 笔记(函数) 1.AVG AVG 函数用于返回数列的平均值。 语法:Select avg(字段名) from 表名。 例子: Select avg(count) AS count_avg from access_log。
8910 0
|
SQL 关系型数据库 数据库连接
OTL技术应用
什么是OTL:OTL 是 Oracle, Odbc and DB2-CLI TemplateLibrary 的缩写,是一个操控关系数据库的C++模板库,它目前几乎支持所有的当前各种主流数据库,如下表所示:   数据库 访问接口 支持版本 Oracle OCI...
1069 0
|
SQL Oracle 关系型数据库
OTL之Oracle开发总结《转》
OTL之Oracle开发总结---转   关 于OTL,网上介绍的也不少,但看来看去也只是官方的那些文档。OTL很好用,结合官方提供的一些例子,多多尝试才能领悟。经过一个月左右的项目开发,对 OTL也有些了解,在这里总结一下,希望对刚接触OTL的新手有所帮助。
970 0
|
存储 Oracle 关系型数据库
OTL调用Oracle存储过程
OTL很早前用过,今天写东西要调存储过程,程序写完了,调试死活通不过,折腾了一早晨。 最后才发现错误,这里总结一下: 1、代码写的不规范。 有个参数后边少写了个“,”以至于总是抱错。而单独写的测试例子就没问题,后来一步一步跟踪了后才发现。
951 0