达梦有仿照OCI(Oracle Call Interface)实现了一套DCI 的接口实现。具体在 <> p261
中有说明。我照着这个实现编译了下,发现可能依文档编译时有点问题,把有问题的地方改了下,记录在这。
VS 设置:
常规 -> 输出目录 -> c:\dmdbms\bin
备注: 为了省事这样弄的,实际发布时,把C:\dmdbms\bin下的.dll文件都复制过去就行了。
C/C++ -> 常规 -> 附加包含目录 -> c:\dmdbms\include 链接器 -> 附加库目录 -> c:\dmdbms\include 链接器 -> 附加依赖项 -> dmoci.lib
#include#include #include #include #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] = {0}; /* 存储执行的sql语句*/ int DMDemo(); int main() { DMDemo(); system("pause"); return 0; } int DMDemo() { char strServerName[50]; char strUserName[50]; char strPassword[50]; /* 设置服务器,用户名和密码 */ strcpy(strServerName,"localhost"); strcpy(strUserName,"SYSDBA"); strcpy(strPassword,"111111"); //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);