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.这篇权当积累。

2015-12-13 pm14:55 思于家中床前

作者:铭毅天下

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

如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

已标记关键词 清除标记
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不二之选。 【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页