《OTL数据库访问技术.ppt》由会员分享,可在线阅读,更多相关《OTL数据库访问技术.ppt(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、OTL数据库访问技术数据库访问技术北京神州数码思特奇信息技术股份有限公司北京神州数码思特奇信息技术股份有限公司研究院研究院OTL 应用开发应用开发1.OTL介绍介绍2.OTL“流流”的概念的概念3.OTL的主要类的主要类4.OTL的使用的使用5.OTL的编译的编译6.OTL参考资料参考资料OTL 介绍介绍什么是什么是OTL:OTL 是 Oracle,Odbc and DB2-CLI Template Library 的缩写,是一个操控关系数据库的C+模板库,它目前几乎支持所有的当前各种主流数据库,如下表所示:数据库数据库访问接口访问接口支持版本支持版本OracleOCIOCI7、OCI8、OC
2、I8i、OCI9i、OCI10gDB2CLIDB2 CLIMS SQL Server、Sybase、Informix、MySQL、Interbase/Firebird、PostgreSQL、SQLite、SAP/DB、TimesTen、MS ACCESSODBCODBC2.5、ODBC3.x备注备注备注备注:OracleOracleOracleOracle和和和和DB2DB2DB2DB2也可以由也可以由也可以由也可以由OTLOTLOTLOTL间接使用间接使用间接使用间接使用ODBCODBCODBCODBC的方式来进行操纵的方式来进行操纵的方式来进行操纵的方式来进行操纵OTLOTL的特点的特点:
3、优点优点(1).跨平台(2).运行效率高,与C语言直接调用数据库API相当(3).开发效率高,使用方便,繁在其内,简在其外,比 ADO.net使用起来更简单,更简洁(4).部署容易,不需要ADO组件,不需要.net framework 等缺点缺点(1).只能在C+中使用OTL 介绍介绍OTL“流流”的概念的概念 任何任何 SQL 语句,语句,PL/SQL 块的调用或者是存储过程调块的调用或者是存储过程调用都可以用用都可以用“流流”的的input/output变量变量来表现。来表现。使用使用SQLSQL语句、语句、PL/SQL PL/SQL 块块 或者是存储过程调用,都可以看作是带输或者是存储过
4、程调用,都可以看作是带输入输出流的黑盒。你可以不关心黑盒的内部工作(只需要依据黑盒的定义)入输出流的黑盒。你可以不关心黑盒的内部工作(只需要依据黑盒的定义)。需要关注的是黑盒的输入输出线。需要关注的是黑盒的输入输出线。O OTL TL“流流”的概念的概念Example 1.SELECT语句有用于WHERE子句的标量input变量。SELECT 语句同时定义了输出列.潜在的输出列是矢量参数,因为SELECT语句可能返回多行。Example 2.INSERT语句往表中写数据,即它有输入参数,其输入参数是标量.UPDATE 语句亦是如此。Example 3.DELETE 从表中删除行,如需要输入删除
5、条件,DELETE语句需有输入参数,其输入参数是标量。Example 4.存储过程可能含有input和(或)output参数。通常存储过程的参数是标量。有一个特例:存储过程返回一个游标(cursor)(ORACLE)或者是结果集(MSSQL、Sybase),此时output参数是矢量。Example 5.任意一个PL/SQL块都可能有标量的输入或矢量的输出参数。OTL“流流”的概念的概念OTL“流流”是缓存流是缓存流 从概念上讲,OTL“流”有两个独立的缓存:输入和输出输入和输出。输入缓存由所有的输入变量共同组成。同样的,输出缓存由所有的输出变量共同组成。OTL“流流”的操作的操作 (1).O
6、TL“流”的操作与C+流一样,通过操作符“”来进行操作,流的引用在操作符的左边。s variable;s -从流到数据容器(变量)-从数据容器(变量)到流 (2).OTL流需要用到OTL异常。即任何OTL流都潜在的会抛 otl_exception 类型的异常。为了截获异常并防止程序中断,请用 相应try&catch 块包装OTL代码段。OTL 的主要类的主要类主要类包括:主要类包括:otl_stream,otl_connect,otl_exception otl_stream类类 otl_stream类类 是是OTL“流流”的概念的具体表现形式,的概念的具体表现形式,任何任何通过输入通过输入/
7、输出参数使用输出参数使用SQL语句、语句、PL/SQL 块块 或者是存储或者是存储过程调用,在过程调用,在C+的编程中都能通过的编程中都能通过 otl_stream 类来实现类来实现。其构造函数为其构造函数为:(1)for Oracle 7/8/9/10:otl_stream(const int arr_size,/流的缓存大小流的缓存大小 const char*sqlstm,/SQL语句或语句或PL/SQL块或存储过程块或存储过程 otl_connect&db,/OTL数据库连接对数据库连接对象象 const char*ref_cur_placeholder=0,/游标引游标引用占位符名称用
8、占位符名称 const char*sqlstm_label=0 /SQL 语句标签语句标签);OTL的主要类的主要类 (2)for ODBC/DB2-CLI:otl_stream(const int arr_size,/流的缓存大小流的缓存大小 const char*sqlstm,/SQL语句或语句或PL/SQL块或存储过程块或存储过程 otl_connect&db,/OTL数据库连接对象数据库连接对象 const int implicit_select=otl_explicit_select,const char*sqlstm_label=0/SQL 语句标签语句标签);otl_connec
9、t类类 otl_connect类封装了一系列有关数据库连接的功能类封装了一系列有关数据库连接的功能:建立连接、断开连接、建立连接、断开连接、事务提交、事务回滚等等。换言之事务提交、事务回滚等等。换言之,otl_connect是在是在C+编程中创建和使用数据编程中创建和使用数据库连接以及进行数据库事务管理的类,主要方法有库连接以及进行数据库事务管理的类,主要方法有:(1)static int otl_initialize(const int threaded_mode=0);该静态方法的主要功能是初始化OTL数据库环境,程序中第一次建立与数据库的连接之前,必须调用该方法一次,其后再建立与数据库的
10、连接,就不需要调用该方法了。如果程序是在多线程环境下访问数据库,参数threaded_mode需置为1。另外在多线程环境下访问数据库,不要多个线程操作同一个otl_connect对象,除非该ot_connect对象有互斥锁机制。(2)void rlogon(const char*connect_str,const int auto_commit=0);该方法的主要功能是建立与数据库的连接。参数connect_str是数据库连接配置字符串,有两种表达形式 A.”USER/PASSWORD”(本地数据库)”USER/PASSWORDTNS_ALIAS”(远程数据库)B.和和 ”USER/PASSW
11、ORDDSN”DSN=value;UID=value;PWD=value”参数auto_commit设置数据库事务的提交模式,auto_commit设置为1,表示数 据库事务自动提交;auto_commit设置为0,表示数据库事务非自动提交,auto_commit 缺省为0。OTL的主要类的主要类 (3)void logoff(void);该方法的主要功能是断开与数据库的连接。该方法的主要功能是断开与数据库的连接。(4)void commit(void);该方法的主要功能是提交数据库事务。该方法的主要功能是提交数据库事务。(5)void rollback(void);该方法的主要功能是回滚数据
12、库事务。该方法的主要功能是回滚数据库事务。otl_exception类类 otl_exception类用于描述类用于描述OTL操作数据时抛出的异常操作数据时抛出的异常,有有3个主要的成个主要的成 员变量员变量:(1)unsigned char msg1000;该成员变量用于保存存异常的具体错误信息。该成员变量用于保存存异常的具体错误信息。(2)char stm_text2048;该成员变量用于保存导致发生异常错误的该成员变量用于保存导致发生异常错误的SQL语句。语句。(3)char var_info256;该成员变量用于保存导致发生异常错误的输入该成员变量用于保存导致发生异常错误的输入/输出变
13、量。输出变量。OTL的主要类的主要类OTL 的使用的使用 OTL OTL使用起来也很简单,使用不同的数据库连接,主要是根据需要在使用起来也很简单,使用不同的数据库连接,主要是根据需要在程序开始的程序开始的宏定义宏定义来指定的。来指定的。OTLOTL是首先根据这个宏定义来初始化数据是首先根据这个宏定义来初始化数据库连接环境。库连接环境。OTLOTL中用来区分连接方式的宏定义主要有下面这些中用来区分连接方式的宏定义主要有下面这些:OTL_ORA7,OTL_ORA8,OTL_ODBC,OTL_DB2_CLI,OTL_ODBC_MYSQL.不同的宏对应的数据库不同的宏对应的数据库APIAPI,具体说明
14、如下:,具体说明如下:宏定义名宏定义名说明说明OTL_ORA7for OCI7OTL_ORA8for OCI8OTL_ORA8Ifor OCI8iOTL_ORA9Ifor OCI9i.All code that compiles and works under#define OTL_ORA7,OTL_ORA8,and OTL_ORA8I,should work when OTL_ORA9I is usedOTL_ORA10Gfor OCI10g.All code that compiles and works under#define OTL_ORA7,OTL_ORA8,OTL_ORA8I,O
15、TL_ORA9I,should work with OTL_ORA10G.OTL_ORA10G_R2for OCI10g,Release 2(Oracle 10.2).All code that compiles and works under#define OTL_ORA7,OTL_ORA8,OTL_ORA8I,OTL_ORA9I,and OTL_ORA10G should work with OTL_ORA10G_R2 宏定义名宏定义名说明说明OTL_DB2_CLIfor DB2 Call Level Interface(CLI)OTL_INFORMIX_CLIfor Informix C
16、all Level Interface for Unix(when OTL_ODBC_UNIX is enabled).OTL_IODBC_BSDfor ODBC on BSD Unix,when iODBC package is usedOTL_ODBCfor ODBCOTL_ODBC_MYSQLfor MyODBC/MySQL.The difference between OTL_ODBC_MYSQL and OTL_ODBC is that transactional ODBC function calls are turned off for OTL_ODBC_MYSQL,since
17、MySQL does not have transactionsOTL_ODBC_POSTGRESQLfor the PostgreSQL ODBC driver 3.5(and higher)that are connected to PostgerSQL 7.4/8.0 (and higher)servers.OTL_ODBC_UNIXfor ODBC bridges in UnixOTL_ODBC_zOSfor ODBC on IBM zOS.OTL_ODBC_XTG_IBASE6 for Interbase 6.x via XTG Systems ODBC driver.The rea
18、son for introducing this#define is that the ODBC driver is the only Open Source ODBC driver for Interbase.Other drivers,like Easysofts ODBC for Interbase,are commercial products,and it beats the purpose of using Interbase,as an Open Source.database server.OTL 的使用的使用SQL使用举例:使用举例:/“”#include using nam
19、espace std;#include#define OTL_ORA9I/Compile OTL 4.0/OCI9i,/#define OTL_UNICODE/Enable Unicode OTL for OCI9i#include /include the OTL 4.0 header file otl_connect db;/connect object void insert();void insertConstant();void insertBatch();void insertNoAutoCommit();void select();void update();void updat
20、eNoAutoCommit();void del();int main()otl_connect:otl_initialize();/initialize OCI environment try db.rlogon(dbuser/dbpwd);/connect to OracleOTL 的使用的使用otl_cursor:direct_exec(db,drop table person_tab,otl_exception:disabled/disable OTL exceptions);/drop tableotl_cursor:direct_exec (db,create table pers
21、on_tab(age number,name varchar2(30);/create table insert();/insert one records into table insertConstant();/constand insert sql insertBatch();/insert batch records into table insertNoAutoCommit();/insert no auto commit;select();/select records from table update();/update records in table updateNoAut
22、oCommit();/update no auto commit del();/delete records from table OTL 的使用的使用 catch(otl_exception&p)/intercept OTL exceptions cerrendl;/print out error message cerrendl;/print out SQL that caused the error cerrendl;/print out the variable that caused /the error ();/disconnect from Oracle return 0;voi
23、d insert()/插入单条数据数据插入单条数据数据 /create insert stream otl_stream o(1,/buffer size insert into person_tab values(:v_age,:v_name),/INSERT statement db/connect object );o30;/assigning:v_age=30 o“dengkf”;/assigning:v_name=“dengkf”/char tmp32;sprintf(tmp,”邓科峰邓科峰”);/o(unsigned char*)tmp;/INSERT automatically
24、executes when all input variables are assigned.OTL 的使用的使用void insertConstant()/恒量恒量insert SQL语句语句 /create insert stream otl_stream o (1,/buffer size insert into person_tab values(30,”dengkf”),/INSERT statement db/connect object );/INSERT automatically executes when all input variables are assigned.O
25、TL 的使用的使用void insertBatch()/批量插入数据批量插入数据 /create insert stream otl_stream o (10000,/buffer size insert into person_tab values(:v_age,:v_name),db/connect object );char tmp32;for(int i=1;i=10000;i+)sprintf(tmp,“NAME%d”,i);oi;otmp;/INSERT automatically executes when all input variables are assigned.OTL
26、 的使用的使用void insertNoAutoCommit()/插入数据插入数据(事务手动提交事务手动提交)/create insert stream otl_stream o (10001,/buffer size insert into person_tab values(:v_age,:v_name),db/connect object );o.set_flush(false);/turning off the streams autoflush flag o.set_commit(0);/turning off the streams autocommit flag char tmp
27、32;for(int i=1;i=10000;i+)sprintf(tmp,“NAME%d”,i);oi;otmp;();/flushing the streams buffer ();/committing the changes to the database OTL 的使用的使用void select()/检索数据检索数据 /create select stream otl_stream I (50,/buffer size select*from person_tab where name=:v_name,/SELECT statement db/connect object );ir
28、_age;ir_name;coutage=r_ageendl;coutname=r_nameendl;OTL 的使用的使用/修改数据修改数据(事务自动提交事务自动提交)void update()/create update stream otl_stream s (1,/buffer size update person_tab set age=:v_age where name=:v_name,/UPDATE statement db/connect object );s31;/assgining:v_age=31 sdengkf;/assigning:v_name=8 /UPDATE au
29、tomatically executes when all input variables are assigned.OTL 的使用的使用/修改数据修改数据(事务手动提交事务手动提交)void updateNoAutoCommit()/create update stream otl_stream s (2,/buffer size update person_tab set age=:v_age where age:v_age2,/UPDATE statement db/connect object );s.set_flush(false);s.set_commit(0);s31;/assg
30、ining:v_age=31 s2000;/assigning:v_age2=2000 ();();OTL 的使用的使用/删除数据删除数据void del()/create delete stream otl_stream l (1,/buffer size “delete from person_tab where name=:v_name,/DELETE statement db/connect object );l=0,SQL执行成功执行成功,返回实际处理成功的记录数返回实际处理成功的记录数.示例:示例:Examples(Oracle)otl_cursor:direct_exec (db
31、,/connect object create table person_tab(age number,name varchar2(30);/create table otl_cursor:direct_exec (db,/connect object drop table persion_tab,/SQL statement otl_exception:disabled/disable OTL exceptions,/in other words,ignore any /database error );/drop tableOTL 的使用的使用 long rpc=otl_cursor:di
32、rect_exec (db,/connect object “delete from persion_tab”);示例:示例:Examples(ODBC,DB2-CLI)otl_cursor:direct_exec (db,/connect object create table person_tab(age numeric,name varchar(30);/create table otl_cursor:direct_exec (db,/connect object drop table persion_tab,/SQL statement otl_exception:disabled/d
33、isable OTL exceptions,/in other words,ignore any /database error );/drop table long rpc=otl_cursor:direct_exec (db,/connect object “delete from persion_tab”);OTL 的使用的使用PL/SQL块使用举例块使用举例:/“”#include using namespace std;#include#include /include the OTL 4.0 header fileotl_connect db;/connect objectvoid
34、 plsql(void)/invoking PL/SQL block otl_stream o(50,/buffer size begin :A:=:A+1;:B:=:C;end;,/PL/SQL block db/connect object );OTL 的使用的使用o.set_commit(0);/set stream auto-commit off since /the block does not have any transactions /to commit o1Test String1;/assigning:A=1,:C=Test String1 o2Test String2;/
35、assigning:A=2,:C=Test String2 o3ab;coutA=a,B=bendl;OTL 的使用的使用int main()otl_connect:otl_initialize();/initialize OCI environment try db.rlogon(“dbuser/dbpwd);/connect to Oracle plsql();/invoking PL/SQL block catch(otl_exception&p)/intercept OTL exceptions cerrendl;/print out error message cerrendl;/p
36、rint out SQL that caused the error cerrendl;/print out the variable that caused the /error ();/disconnect from Oracle return 0;OTL 的使用的使用输出输出:A=2,B=Test Stri ng1A=3,B=Test String2A=4,B=Test String3 常量常量PL/SQL块的使用与常量块的使用与常量SQL的使用类似,在此不再赘述。的使用类似,在此不再赘述。OTL 的使用的使用存储过程使用举例:存储过程使用举例:#include using namesp
37、ace std;#include#include /include the OTL 4.0 header fileotl_connect db;/connect objectvoid stored_proc(void)otl_stream o(1,/buffer size should be equal to 1 in case of /stored procedure call begin my_proc(:a,:b,:c );end;,/stored procedure call db/connect object );OTL 的使用的使用 o.set_commit(0);/set str
38、eam auto-commit off since /the stream does not generate transaction o1a2b2;coutA=a2endl;coutB=b2endl;OTL 的使用的使用int main()otl_connect:otl_initialize();/initialize environment try db.rlogon(“dbuser/dbpwd);otl_cursor:direct_exec (db,CREATE OR REPLACE PROCEDURE my_proc (A IN OUT NUMBER,B OUT VARCHAR2,C
39、IN VARCHAR2)IS BEGIN A:=A+1;B:=C;END;);/也可以直接用代码创建来测试用的过程也可以直接用代码创建来测试用的过程 OTL 的使用的使用 stored_proc();/invoking stored procedure catch(otl_exception&p)/intercept OTL exceptions cerrendl;/print out error message cerrendl;/print out SQL that caused the error cerrendl;/print out the variable that caused
40、the /error ();/disconnect from the data source return 0;常量存储过程的使用与常量常量存储过程的使用与常量SQL的使用类似,在此不再赘述。的使用类似,在此不再赘述。OTL 的使用的使用OTL 的编译的编译 在编译在编译OTLOTL的程序时,需要使用到相应的数据库的程序时,需要使用到相应的数据库APIAPI,这,这就要程序在就要程序在编译时联接编译时联接liblib库文件,不同的数据库对应的库文件,不同的数据库对应的liblib文件所在位文件所在位置各不相置各不相同,下面是分别在同,下面是分别在windowswindows与与UnixUnix
41、下的数据库下的数据库APIAPI所需要的头所需要的头文件及文件及liblib文文件所在的位置列表:件所在的位置列表:APIAPI header files for WindowsAPI libraries for WindowsOCI7ociincludeocilibociw32.libOCI8ociincludeociliboci.libOCI8iociincludeociliboci.libOCI9iociincludeociliboci.libOCI10gociincludeociliboci.libODBCNormally,in one of the C+compiler system
42、 directories,no need to include explicitly.Normally,in one of the C+compiler system directories:odbc32.libDB2 CLIincludelibdb2api.lib libdb2cli.libAPIAPI header files for UnixAPI libraries for UnixOCI7-I$(ORACLE_HOME)/rdbms/demo -I$(ORACLE_HOME)/rdbms/public-L$(ORACLE_HOME)/lib/-lclntshOCI8-I$(ORACL
43、E_HOME)/rdbms/demo -I$(ORACLE_HOME)/rdbms/public-L$(ORACLE_HOME)/lib/-lclntshOCI8i-I$(ORACLE_HOME)/rdbms/demo -I$(ORACLE_HOME)/rdbms/public-L$(ORACLE_HOME)/lib/-lclntshOCI9i-I$(ORACLE_HOME)/rdbms/demo -I$(ORACLE_HOME)/rdbms/public-L$(ORACLE_HOME)/lib/-lclntshOCI10g-I$(ORACLE_HOME)/rdbms/demo -I$(ORACLE_HOME)/rdbms/public-L$(ORACLE_HOME)/lib/-lclntshODBCODBC bridge specificODBC bridge specificDB2 CLI-I/sqllib/include-L/sqllib/lib-ldb2OTL 的编译的编译OTL 实例实例OTL参考资料参考资料OTLOTL最新版本为最新版本为4.0,4.0,参见参见:下载地址下载地址:目前提供有目前提供有377377个使用范例可参考,下载地址个使用范例可参考,下载地址:。