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;
}