热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

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

达梦有仿照OCI(OracleCallInterface)实现了一套DCI的接口实现。具体在DM_programp261中有说明。我照着这个实现编译了下,发现可能依文档编译时有点问题,把有问题的地方改了下,记录在这。VS设置:常规

达梦有仿照OCI(Oracle Call Interface)实现了一套DCI 的接口实现。具体在 DM_program p261 中有说明。我照着这个实现编译了下,发现可能依文档编译时有点问题,把有问题的地方改了下,记录在这。 VS 设置: 常规 - 输出目录 - c:\dmdbms\bin 备注: 为了省事这

达梦有仿照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);  
   
  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); 
	  /*   绑定输入列    */ 
	  const OraText col_sex[] = ":sex";
	  const OraText col_name[] = ":name";
	  const OraText col_email[] = ":email";
	  const OraText col_phone[] = ":phone";

	  OCIBindByName(stmthp, &bidhp[0], errhp, col_sex, 4, szsex, sizeof(szsex),SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);  
	  OCIBindByName(stmthp, &bidhp[1], errhp, col_name, 5, szname, sizeof(szname), SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);  
	  OCIBindByName(stmthp, &bidhp[2], errhp, col_email, 6, szemail, sizeof(szemail),SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);  
	  OCIBindByName(stmthp, &bidhp[3], errhp, col_phone, 6, szphone, sizeof(szphone),SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);  
	
	//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");  
	memcpy(szsex,"M",strlen("M")+1);

	memset(szname, 0, sizeof(szname)); 
	//strcpy(szname, " 张三");  
	memcpy(szname,"张三",strlen("张三")+1);

	memset(szemail, 0, sizeof(szemail)); 
	//strcpy(szemail, "zhangsan@dameng.com");  
	memcpy(szemail,"zhangsan@dameng.com",strlen("zhangsan@dameng.com")+1);

	memset(szphone, 0, sizeof(szphone));  
	memcpy(szphone,"027-87588000",strlen("027-87588000")+1);
	//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=&#39;M&#39;,name=&#39;Liuhuan&#39;,email=&#39;liujian@mail&#39;,phOne=&#39;13636396811&#39; 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));  
	  memcpy(szpersonid,"20",strlen("20")+1);
	  //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;  
  }

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
0o可人儿o0_962
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有