达梦(5)通过DCI实现增删改查(一)

2014-11-24 10:57:41 · 作者: · 浏览: 2
达梦有仿照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);