達夢數據庫(DM7)OCI編程示例

       DM7提供類似於ORACLE數據庫OCI接口的DCI接口,用來兼容ORACLE OCI接口編程的應用程序。其中DCI接口具有和OCI接口相同的函數名以及參數,這樣應用在進行移植時,無需進行修改即可適配,其使用方式兼容ORACLE數據庫。在使用DM7的DCI接口時,需要引用DM7數據庫的dmoci.lib庫,在運行時需要dmoci.dll等庫。下面給出編程示例:

示例person表定義:

create table person
(
   persionid  int identitiy(1,1) not null,
   sex char(1) not null,
   name varchar(50) not null,
   email varchar(50) ,
   phone  varchar(25),
   cluster primary key(personid)
);  

OCI示例程序如下:

     #include <stdio.h> 
     #include <string.h> 
     #include <stdlib.h> 
     #include <malloc.h> 
     #include "dci.h" 

     /*   聲明句柄 */ 
     OCIEnv          *envhp;             /*   環境句柄            */ 
     OCISvcCtx       *svchp;             /*   服務環境句柄          */ 
     OCIServer       *srvhp;             /*   服務器句柄           */ 
     OCISession      *authp;             /*   會話句柄            */ 
     OCIStmt         *stmthp;            /*   語句句柄            */ 
     OCIDescribe     *dschp;             /*   描述句柄            */ 
     OCIError        *errhp;             /*   錯誤句柄            */ 
     OCIDefine       *defhp[3];          /*   定義句柄            */ 
     OCIBind         *bidhp [4];         /*   綁定句柄            */ 
     sb2             ind[3];             /*   指示符變量           */ 

     /*   綁定select結果集的參數            */ 
     text            szpersonid[11];     /*   存儲personid列 */ 
     text            szsex[2];           /*   存儲sex列 */ 
     text            szname[51];         /*   存儲name列         */ 
     text            szemail[51];        /*   存儲mail列         */ 
     text            szphone[26];        /*   存儲phone列        */ 
     char            sql[256];           /*   存儲執行的sql語句*/ 


     int main(int argc, char *argv[]) 
     { 
          char strServerName[50]; 
          char strUserName[50]; 
          char strPassword[50]; 
          /*    設置服務器,用戶名和密碼                  */ 
          strcpy(strServerName,"localhost"); 
          strcpy(strUserName,"SYSDBA");
          strcpy(strPassword,"SYSDBA"); 

           /* 初始化OCI應用環境*/ 
           OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL); 
           /* 初始化環境句柄            */ 
           OCIEnvInit(&envhp, OCI_DEFAULT,0, 0); 
           /*   分配句柄             */ 
           OCIHandleAlloc(envhp, (dvoid**)&svchp, OCI_HTYPE_SVCCTX, 0, 0);              /*   服務器環境句柄  */ 
           OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, 0, 0);              /*   服務器句柄     */ 
           OCIHandleAlloc(envhp, (dvoid**)&authp, OCI_HTYPE_SESSION, 0, 0);
/*   會話句柄       */ 
           OCIHandleAlloc(envhp, (dvoid**)&errhp, OCI_HTYPE_ERROR, 0, 0);               /*   錯誤句柄       */ 
           OCIHandleAlloc(envhp, (dvoid**)&dschp, OCI_HTYPE_DESCRIBE,0,0);                   /*    描述符句柄    */ 
           /*   連接服務器    */ 
           OCIServerAttach(srvhp, errhp,(text *)strServerName, 
                (sb4)strlen(strServerName),OCI_DEFAULT); 
           /*   設置用戶名和密碼              */ 
           OCIAttrSet(authp,OCI_HTYPE_SESSION,(text *)strUserName, 
                (ub4)strlen(strUserName),OCI_ATTR_USERNAME,errhp); 
           OCIAttrSet(authp,OCI_HTYPE_SESSION,(text *)strPassword, 
                (ub4)strlen(strPassword), OCI_ATTR_PASSWORD,errhp); 
           /*   設置服務器環境句柄屬性 */ 
           OCIAttrSet ((dvoid*)svchp, (ub4) OCI_HTYPE_SVCCTX, 
                (dvoid*)srvhp, (ub4) 0, OCI_ATTR_SERVER, errhp); 
           OCIAttrSet(svchp, OCI_HTYPE_SVCCTX,(dvoid*)authp, 
                0, OCI_ATTR_SESSION, errhp); 
           /*   創建並開始一個用戶會話 */ 
           OCISessionBegin (svchp, errhp, authp,OCI_CRED_RDBMS,OCI_DEFAULT); 
           OCIHandleAlloc(envhp, (dvoid**)&stmthp,OCI_HTYPE_STMT, 0, 0);                /*   語句句柄 */

           /************************************************************************/ 

           /* 查詢person表*/                                                                      
           /************************************************************************/ 

           strcpy(sql, "select personid, name, phone from person.person;"); 
           /*   準備SQL語句               */ 
           OCIStmtPrepare(stmthp, errhp,(text *)sql, strlen(sql),OCI_NTV_SYNTAX, OCI_DEFAULT); 
           /*   綁定輸出列                 */ 
           OCIDefineByPos (stmthp,&defhp[0],errhp, 1,(ub1*)szpersonid,                      sizeof(szpersonid),SQLT_STR,&ind[0], 0, 0, OCI_DEFAULT); 
           OCIDefineByPos (stmthp,&defhp[1],errhp, 2,(ub1*)szname,                       sizeof(szname),SQLT_STR,&ind[1], 0, 0, OCI_DEFAULT); 
           OCIDefineByPos (stmthp,&defhp[2],errhp, 3,(ub1*)szphone,
sizeof(szphone),SQLT_STR,&ind[2], 0, 0, OCI_DEFAULT); 
           /*    執行SQL語句                */ 
           OCIStmtExecute(svchp, stmthp,errhp, (ub4)0, 0, NULL, NULL, OCI_DEFAULT); 
           printf("%-10s%-10s%-10s\n", "PERSONID", "NAME", "PHONE"); 
           while((OCIStmtFetch(stmthp, errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT))!=OCI_NO_DATA) 
            { 
                 printf("%-10s", szpersonid); 
                 printf("%-10s", szname); 
                 printf("%-10s\n", szphone); 
           } 

           /************************************************************************/ 

           /*  向person表插入一條數據*/                                                                     
           /************************************************************************/ 

           memset(sql, 0, sizeof(sql)); 
           strcpy(sql, "insert into person.person(sex, name, email, phone) values(:sex,:name,:email,:phone);"); 
           /*    準備SQL語句                */ 
           OCIStmtPrepare(stmthp, errhp,(text *)sql, strlen(sql),OCI_NTV_SYNTAX, OCI_DEFAULT); 
           /*    綁定輸入列                  */ 
           OCIBindByName (stmthp, &bidhp[0], errhp, ":sex", 4, szsex, sizeof(szsex), SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0); 
           OCIBindByName (stmthp, &bidhp[1], errhp, ":name", 5, szname, sizeof(szname), SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0); 
           OCIBindByName (stmthp, &bidhp[2], errhp, ":email", 6, szemail, sizeof(szemail), SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0); 
           OCIBindByName (stmthp, &bidhp[3], errhp, ":phone", 6, szphone, sizeof(szphone), SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0); 
           /*    設置輸入參數           */ 
           memset(szsex, 0, sizeof(szsex)); 
           strcpy(szsex, "M"); 
        memset(szname, 0, sizeof(szname)); 
           strcpy(szname, "張三"); 
           memset(szemail, 0, sizeof(szemail)); 
           strcpy(szemail, "[email protected]"); 
           memset(szphone, 0, sizeof(szphone)); 
           strcpy(szphone, "027-87588000"); 
           /*    執行SQL語句                */ 
           OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, (ub4) 0, (CONST OCISnapshot*) 0, (OCISnapshot*) 0, (ub4) OCI_DEFAULT); 
           /*    提交到數據庫           */ 
           OCITransCommit(svchp, errhp, OCI_DEFAULT); 

           /************************************************************************/ 
           /*  更新person表*/                                                                            
           /************************************************************************/

           memset(sql, 0, sizeof(sql)); 
           strcpy(sql, "update person.person set 
sex='M',name='Liuhuan',email='liujian@mail',phone='13636396811' WHERE personid=1"); 
           /*   準備SQL語句               */ 
           OCIStmtPrepare(stmthp, errhp,(text *)sql, strlen(sql),OCI_NTV_SYNTAX, OCI_DEFAULT); 
           /*   執行SQL語句               */ 
           OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, (ub4) 0, (CONST OCISnapshot*) 0, (OCISnapshot*) 0, (ub4) OCI_DEFAULT); 
           /*   提交到數據庫           */ 
           OCITransCommit(svchp, errhp, OCI_DEFAULT); 

           /************************************************************************/ 
           /* 刪除person表的ID爲的數據,首先要在數據庫中存在這條記錄                                      */ 
           /************************************************************************/ 

           memset(sql, 0, sizeof(sql)); 
           strcpy(sql, "delete from person.person WHERE personid=?"); 
           /*   準備SQL語句               */ 
           OCIStmtPrepare(stmthp, errhp,(text *)sql, strlen(sql),OCI_NTV_SYNTAX, OCI_DEFAULT); 
           /*   綁定輸入參數           */ 
           memset(szpersonid, 0, sizeof(szpersonid)); 
           strcpy(szpersonid, "20"); 
           OCIBindByPos(stmthp, &bidhp[0], errhp, 1, szpersonid, sizeof(szpersonid), SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0); 
           /*   執行SQL語句               */ 
           OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, (ub4) 0, (CONST OCISnapshot*) 0, (OCISnapshot*) 0, (ub4) OCI_DEFAULT); 
           /*   提交到數據庫           */ 
           OCITransCommit(svchp, errhp, OCI_DEFAULT); 
           //結束會話 
           OCISessionEnd(svchp, errhp, authp, (ub4) 0); 
           //斷開與數據庫的連接 
           OCIServerDetach(srvhp, errhp, OCI_DEFAULT); 
           //釋放OCI句柄 
           OCIHandleFree((dvoid*)dschp, OCI_HTYPE_DESCRIBE); 
           OCIHandleFree((dvoid*)stmthp, OCI_HTYPE_STMT ); 
           OCIHandleFree((dvoid*)errhp, OCI_HTYPE_ERROR); 
           OCIHandleFree((dvoid*)authp, OCI_HTYPE_SESSION ); 
           OCIHandleFree((dvoid*)svchp, OCI_HTYPE_SVCCTX); 
           OCIHandleFree((dvoid*)srvhp, OCI_HTYPE_SERVER); 
           return 0; 
      }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章