WEB开发网
开发学院数据库Oracle DM API和OCI编程方式比较 阅读

DM API和OCI编程方式比较

 2008-09-03 12:50:56 来源:WEB开发网   
核心提示: intc1;intlen1;intc2[101];intlen2;c2[100]=0;//执行查询语句生成结果集dm_direct_exec(hstmt,“selectc1,c2fromt”);//绑定第一列dm_bind_column(hstmt,1,DM_DAT

   intc1;
  intlen1;
  intc2[101];
  intlen2;
  c2[100]=0;
  //执行查询语句生成结果集
  dm_direct_exec(hstmt,“selectc1,c2fromt”);
  //绑定第一列
  dm_bind_column(hstmt,1,DM_DATA_INT,TYPE_INT,&c1,4,&len1,0);
  //绑定第二列
  dm_bind_column(hstmt,2,DM_DATA_CHAR,TYPE_CHAR,c2,100,&len2,0);
  //提取结果集
  while(dm_fetch(hstmt,NULL)==0){
  printf("c1:%d,c2:%s",c1,c2);
  }
  //提取完以后需要关闭游标句柄
  dm_close_stmt(hstmt);

b) OCI

OCI在绑定的时候只有一种形式,通过调用OCIDefineByPos来实现对每个列的绑定,如果你需要一次性获取多行,你还需要调用OCIDefineArrayOfStruct函数来约定每个值跟下一个值之间的偏移量。一次性获取的行数可以在OCIStmtExecute或OCIStmtFetch函数中指定,下面列出对OCIDefineByPos的注释:

   swordOCIDefineByPos(
  OCIStmt*stmtp,/*语句句柄*/
  OCIDefine**defnp,/*绑定输出指针*/
  OCIError*errhp,/*错误句柄*/
  ub4position,/*绑定列的位置*/
  dvoid*valuep,/*缓冲区指针*/
  sb4value_sz,/*单个值的大小*/
  ub2dty,/*要转化成的OCI数据类型*/
  dvoid*indp,/*空值指示符*/
  ub2*rlenp,/*实际返回长度指示符*/
  ub2*rcodep,/*下面两参数为保留参数*/
  ub4mode
  )

跟据上面API的例子,在这里给出OCI的代码:

   intc1;
  intlen1;
  intc2[101];
  intlen2;
  c2[100]=0;
  text*sqlstmt=(text*)"selectc1,c2fromt";
  //在绑定前先要准备语句
  OCIStmtPrepare(stmthp,errhp,sqlstmt,(ub4)strlen((char*)sqlstmt),
  (ub4)OCI_NTV_SYNTAX,(ub4)OCI_DEFAULT);
  //绑定第一列
  OCIDefineByPos(stmthp,NULL,errhp,(ub4)1,
  (dvoid*)&c1,(sb4)sizeof(int),(ub2)SQLT_INT,
  (dvoid*)0,(ub2*)0,(ub2*)0,(ub4)OCI_DEFAULT)
  //绑定第二列
  OCIDefineByPos(stmthp,NULL,errhp,(ub4)2,
  (dvoid*)c2,(sb4)100,(ub2)SQLT_AFC,
  (dvoid*)0,(ub2*)0,(ub2*)0,(ub4)OCI_DEFAULT)
  OCIStmtExecute(svchp,stmthp,errhp,(ub4)0,(ub4)0,(CONSTOCISnapshot*)0,(OCISnapshot*)0,(ub4)OCI_DEFAULT);
  //在这里每次提取一行
  while(OCIStmtFetch(stmthp,errhp,1,OCI_FETCH_NEXT,0)==0){
  printf("c1:%d,c2:%s",c1,c2);
  }

6. 释放连接

a) API

在执行完所有的SQL操作以后,需要断开跟数据库服务器的连接。API在断开时需要释放所申请的所有句柄,包括语句句柄,连接句柄和环境句柄,语句句柄需要在断开连接之前释放。

  dm_close_stmt(hstmt);
  /*释放语句句柄*/
  dm_free_stmt(hstmt);
  /*断开与数据源之间的连接*/
  dm_logout(hdbc);
  /*释放连接句柄*/
  dm_free_connect(hdbc);
  /*释放环境句柄*/
  dm_free_env(henv);

b) OCI

OCI跟API一样,断开连接以后需要释放所有的句柄,这些释放工作都是通过调用OCIHandleFree来完成,例子可以参看连接部分的代码。

7. 结束语

我们可以看到,API和OCI在使用上都有几份类似,在连接和释放上面,两者区别不大,但是在参数和结果集绑定上面,API使用的时候比较的灵活多变,有很多参数可以灵活的指定,但是使用起来感觉比较复杂,而OCI则简单多了,但是同样可以实现API绑定的大部分功能。如果想要更详细的了解API和OCI,那么请参看ODBC标准手册和ORACLE的OCI说明手册,哪上面有更加详细的使用介绍。

上一页  1 2 3 4 5 6 

Tags:DM API OCI

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接