的确oci是最快的
bde都比ado快
odbc最慢

解决方案 »

  1.   

    我看了一下,ProC是在 OCI上封装了一层,那应该是比较快的了,那谁有没有例程,ProC中有没有连接句柄这种概念?
      

  2.   

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sqlca.h>
    #include <sqlda.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <time.h>
    #include <dlfcn.h>
    #include <stdarg.h>EXEC SQL INCLUDE SQLCA;
    EXEC SQL INCLUDE ORACA.H;
    EXEC ORACLE OPTION(RELEASE_CURSOR=YES);int ConnectDB()
    {
    EXEC SQL WHENEVER SQLERROR GOTO err;
    EXEC SQL BEGIN DECLARE SECTION;
    VARCHAR un[20];
    VARCHAR pw[20];
    EXEC SQL END DECLARE SECTION;

    strcpy((char*)un.arr, USERNAME);
    un.len = strlen((char*)un.arr);
    strcpy((char*)pw.arr, PASSWORD);
    pw.len = strlen((char*)pw.arr);
    EXEC SQL CONNECT :un IDENTIFIED BY :pw;
    return SNY_OK;err:
    return SNY_NOTOK;
    }int CloseDB()
    {
    EXEC SQL WHENEVER SQLERROR GOTO err;
    EXEC SQL COMMIT RELEASE;
    return SNY_OK;err:
    return SNY_NOTOK;
    }int main()
    {
    EXEC SQL BEGIN DECLARE SECTION;
    VARCHAR thedate[20];
    EXEC SQL END DECLARE SECTION;

    if (ConnectDB() == -1)
         {
         printf("module *** ConnectDB Error.\n");
         return SNY_NOTOK;
         }
        
         EXEC SQL WHENEVER SQLERROR GOTO error;
         EXEC SQL WHENEVER NOT FOUND GOTO notFound;

    EXEC SQL DECLARE cur CURSOR FOR
    SELECT time_end FROM log ORDER BY name; EXEC SQL OPEN cur;

    memset((void*)&thedate, 0, sizeof(thedate));
    EXEC SQL FETCH cur INTO :thedate;     while(sqlca.sqlcode==0) 
    {
    printf("date:%s\n", thedate.arr);
    memset((void*)&thedate, 0, sizeof(thedate));
    EXEC SQL FETCH cur INTO :thedate;
    }
    notFound:
    EXEC SQL CLOSE cur;

    printf("is ok!\n\n");

         if (CloseDB() == -1)
    {
    printf("module *** CloseDB Error.\n");
    return SNY_NOTOK;
    }
    return 0;
    error:
    printf("\nError: %.70s \n",sqlca.sqlerrm.sqlerrmc);    
         if (CloseDB() == -1)
    {
    printf("module *** CloseDB Error.\n");
    return SNY_NOTOK;
    }
    return 0;
    }
      

  3.   

    oci的连接:
      OCISession *authp = (OCISession *) 0;
      OCIServer *srvhp;
      OCISvcCtx *svchp;
      (void) OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0,
                           (dvoid * (*)(dvoid *, size_t)) 0,
                           (dvoid * (*)(dvoid *, dvoid *, size_t))0,
                           (void (*)(dvoid *, dvoid *)) 0 );  (void) OCIEnvInit( (OCIEnv **) &envhp, OCI_DEFAULT, (size_t) 0,
                         (dvoid **) 0 );  (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR,
                       (size_t) 0, (dvoid **) 0);  /* server contexts */
      (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &srvhp, OCI_HTYPE_SERVER,
                       (size_t) 0, (dvoid **) 0);  (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &svchp, OCI_HTYPE_SVCCTX,
                       (size_t) 0, (dvoid **) 0);  (void) OCIServerAttach( srvhp, errhp, (text *)"", strlen(""), 0);  /* set attribute server context in the service context */
      (void) OCIAttrSet( (dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *)srvhp,
                         (ub4) 0, OCI_ATTR_SERVER, (OCIError *) errhp);  (void) OCIHandleAlloc((dvoid *) envhp, (dvoid **)&authp,
                            (ub4) OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0);  (void) OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION,
                     (dvoid *) username, (ub4) strlen((char *)username),
                     (ub4) OCI_ATTR_USERNAME, errhp);  (void) OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION,
                     (dvoid *) password, (ub4) strlen((char *)password),
                     (ub4) OCI_ATTR_PASSWORD, errhp);  checkerr(errhp, OCISessionBegin ( svchp,  errhp, authp, OCI_CRED_RDBMS,
                              (ub4) OCI_DEFAULT));  (void) OCIAttrSet((dvoid *) svchp, (ub4) OCI_HTYPE_SVCCTX,
                       (dvoid *) authp, (ub4) 0,
                       (ub4) OCI_ATTR_SESSION, errhp);
      

  4.   

    ado使用ODBC连接,ODBC是通用接口,速度慢
    效率比较
    odbc<pro*c<oci怀疑oracle公司某些工具就是使用oci开发的
      

  5.   

    去orafaq.com看看吧,
    空口无凭
      

  6.   

    oci:  oracle call  interface  的缩写,也就是类似  API  这个含义
    如果你能不通过oracle的编程接口“直接操作”数据库的文件
    那自然更快,你明白oracle的文件结构的话
      

  7.   

    我原来不清楚的是sqllib 库是不是最终也是使用oci 调用,因为我觉得这样对oracle 来讲似乎更经济,不用同时维护两个功能相识的接口.刚才再查了些资料后才知道两者最后都会使用叫UPI的接口(User Programmatic Interface )PRECOMPILER --> SQLLIB CALLS --->| UPI ---> SQLNET ---> SERVER. 
    OCI CALLS----------------------->| UPI ---> SQLNET ---> SERVER. oci 虽然用起来好像很繁,但封装和代码管理起来都比pro*c好得多 ,目前已经有一些现成的封装类(如ociwrap),用起来比pro*c 还简单.9i 还提供了一个在oci 上的c++封装工具OCCI,使用ott 能把数据表直接转换为c++ 类,连访问代码都包含在其中了,感觉上挺方便的,不知道有那位用过的能谈一下经验.上面是摘的一断话:
    原文
    http://itpub.net/showthread.php?s=&threadid=64113
      

  8.   

    to biti_rainy:
    oci并不是直接操纵数据库的文件,
    PRECOMPILER --> SQLLIB CALLS --->| UPI ---> SQLNET ---> SERVER. 
    OCI CALLS----------------------->| UPI ---> SQLNET ---> SERVER. 
    都需要sqlnet解析,
    也就是说oracle只有一个接口SQLNET,
    任何操作都是建立在SQLNET之上的
      

  9.   

    楼上的,我几时说过 oci 是直接操作 数据库的文件了???我早交代过这个问题我说如果你能直接操作数据库文件,那样当然可以很快,但是,你能么?我想你一定是把我的话读错意思了  :)
    我既然把后面的  
    PRECOMPILER --> SQLLIB CALLS --->| UPI ---> SQLNET ---> SERVER. 
    OCI CALLS----------------------->| UPI ---> SQLNET ---> SERVER. 都交代出来了
    还不至于犯这样的错误吧   :)