zoukankan      html  css  js  c++  java
  • OTL简介

    OTL简介 - cdone的专栏 - 博客频道 - CSDN.NET

    OTL简介

    1419人阅读 评论(0) 收藏 举报

    OOTL简介 

    1       特点:

    Ø         跨数据库平台:

    n         支持 oracle OCI

    n         支持DB2CLI,

    n         支持ODBC(通过ODBC,可支持SQL SERVER,MySQL)

    Ø         OS平台:

    n         标准C++语言,支持 unix/linux/windows

    Ø         使用简单:

    n         只有一个头文件;

    n         接口简洁.otl_stream, otl_connect, otl_exception等就可以完成大部分工作;

    n         相对 ProC等嵌入式开发,代码能相应减少;

    Ø         性能:       

    n         直接访问数据库API接口,具有API接口的高效率,可靠性和线程线安全;

    Ø         稳定性:     

    n         开源代码,唯一的代码文件otlv4.h,可以了解所有基于数据库API的实现细节;

    n         1996年开始,到今已10余年.

    Ø         可读性及可维护性:

    n         标准C++代码,不需要任何预处理;

    n         使用流的形式,输入输出异常简洁;

    n         减少大量代码,

    n         代码结构更加简洁

                

     

    参考资料:

    http://otl.sourceforge.net/          

     

     

     

    2       类介绍

    下面以常用的和重要的几个类进行简单介绍,更详细的资料建议大家参考:

    http://otl.sourceforge.net/ 

    2.1      otl_connect

    Ø         static int otl_initialize(const int threaded_mode=0);

    静态函数,在联接数据库前调用;

     

    Ø         void rlogon(const char* connect_str,const int auto_commit=0);

    此函数在oracle DB2上的实现有差异,但语法是统一的.其中,DB2只要指定实例名,不会判断用户名和密码.

    n        OTL 4.0/OCIx style 

    u      "USER/PASSWORD" (for local Oracle connections)

    u      "USER/PASSWORD@TNS_ALIAS" (for remote Oracle connections via SQL*Net) 

    n        OTL 4.0/ODBC and OTL 4.0/DB2-CLI style

    u      "USER/PASSWORD/@DSN" (Oracle-like style for ODBC or DB2-CLI connections)

    u      "DSN=value;UID=value;PWD=value" (ODBC-like style for ODBC or DB2-CLI connection)

    Ø         void logoff(void);

    断开数据库联接;

     

    2.2      otl_stream

    Ø         void open(const int arr_size, // stream buffer size
                   const char* sqlstm, // SQL statemnet or stored procedure call
                  
    otl_connect& db, // connect object)

    此函数还有两个参数,根据ORACLE OCIDB2 CLI的不同而有所不一样,基本不用关心;

     

    Ø        int eof(void);         //判断记录是否处理完毕, 返回0表示处理完;

    Ø         long get_rpc(void);   //处理的记录数,尽量少用,目前在各种数据库下会有不同;在正常与异常下也会有所不同;

    Ø         void close(void);                      //关闭记录集;

    Ø         void set_commit(int auto_commit=0);    //设置数据库提交模式,缺省为不自动提交;

    Ø         void flush(void);                     // output buffer的内容提交

    2.3      otl_exception

    有如下成员变量,可供查询异常时的信息

    Ø          char stm_text[2048 or OTL_EXCEPTION_STM_TEXT_SIZE];  // 发生异常时的SQL语句

    Ø         unsigned char msg[1000];                            // 异常信息;

    Ø         int code;                                          // 异常代码; 

    3       example:

    #include <iostream>

     

    #define OTL_DB2_CLI

    #include "otlv4.h"

     

    using namespace std;

     

    char temp[2][128];

    char strCode[16];

    char g_strDBConnectPara[128];

    char strSQL[2048];

    otl_connect db;

     

    void test1();

    void test2();

    void test3();

     

    int main()

    {   

          

             strcpy(g_strDBConnectPara,"db2inst1/db2inst1@db282");

          

             otl_connect::otl_initialize();

                

        try

        {

              

          db.rlogon( g_strDBConnectPara );

          printf("rlogon ok./n");

                  

               test1();

               test2();

               test3();

              }

              catch(otl_exception& e)

         {

               printf("ERROR code=[%d]/n msg=[%s]/nSQL=[%s]/n",

            e.code,

            e.msg,

            e.stm_text);

        }

     

             db.logoff();

             return 0; 

    }

     

    void test1()

    {

           otl_stream c(1,"select code,code_name from meta_code_name ",db);

     

     

      int idx = 0;

      while(!c.eof())

      {     

         c >> temp[0] >> temp[1];

              

         idx++;

         cout << idx << "   code=["    << temp[0]

               << "]  code_name is:"   << temp[1]

               << "  last_eof_rc="     << c.last_eof_rc

               << "  end_marker="      << c.end_marker

               << "  oper_int_called=" << c.oper_int_called

               << endl;

      }  

      printf("dealed [%d] records./n",c.get_rpc());

    }

     

    void test2()

    {

          

           sprintf(strSQL,"select code,code_name from meta_code_name where code =:f1<char[16]>");        

       strcpy(strCode,"10");

      

       otl_stream o(100,strSQL,db);

       o << strCode;

       int idx = 0;

       while(!o.eof())

       {     

          o >> temp[0] >> temp[1];

             

          idx++;

             

          cout << idx << "   code=[" << temp[0]

                << "]  code_name is:" << temp[1]

                << "  last_eof_rc=" << o.last_eof_rc

                << "  end_marker=" << o.end_marker

                << "  oper_int_called=" << o.oper_int_called

                << endl;

        }

    }

         

    void test3()

    {

            cout << endl << "Please input SQL:" << endl;

       cin.getline(strSQL,1024);

      

       cout << strSQL << endl;

      

       otl_stream d; 

       d.open(100,strSQL,db);

     

      

       double fResult = 0;

       int iResult = 0;

       int desc_len = 0;

      

       //根据查询的字段类型,用不同的数据类型获取数据

       otl_column_desc* desc;

       desc=d.describe_select(desc_len);

      

       otl_datetime tResult;

      

       while(!d.eof())

       {

        int idx = 0;   

        for(int i = 0;i <  desc_len; i++)

        {

           idx++;

           switch(desc[i].otl_var_dbtype)

           {

             case 1:                                      //otl_var_char

                    d>>temp[0];

                    break;

                    

             case 2:                                     //otl_var_double

             case 3:                                     //otl_var_float

                    d>>fResult;

                    sprintf(temp[0],"%f",fResult);

                    break;

                                                          

             case 4:                                     //otl_var_int

             case 5:                                     //otl_var_unsigned_int

             case 6:                                     //otl_var_short

             case 7:                                     //otl_var_long_int

                    d>>iResult;

                    sprintf(temp[0],"%d",iResult);

                    break;

            

             case 9:                                     //otl_var_varchar_long

             case 10:                                    //otl_var_raw_long

                    d>>iResult;

                    sprintf(temp[0],"%ld",iResult);

                    break;

                    

             case 8:                                    //otl_var_timestamp

             case 16:                                   //otl_var_db2time

             case 17:                                   //otl_var_db2date

             case 18:                                   //otl_var_tz_timestamp

             case 19:                                   //otl_var_ltz_timestamp

                    d>>tResult;

                    sprintf(temp[0],"%d-%d-%d %d:%d:%d",

                            tResult.year,tResult.month,tResult.day,tResult.hour,tResult.minute,tResult.second);

                    break;

                    

             default:

                    d>>temp[0];

                    break;

           }

          

           cout  << temp[0] << "/t";

          }

          cout << endl;

        }

    }

  • 相关阅读:
    vue中在echarts tooltip中添加点击事件
    支配树
    mac安装protobuf
    mac安装 thrift
    Javascript设计模式读书笔记二 接口
    WebBrowser捕获网页关闭事件
    谈谈UserControl调用页面的几种方法
    屏蔽刷新提交后台
    [喜讯]Acey.ExcelX组件已发布在componentsource
    AceyOffice教程如何判断单元格的内容
  • 原文地址:https://www.cnblogs.com/lexus/p/2946499.html
Copyright © 2011-2022 走看看