执行SQL语句并处理结果
向数据库发出执行SQL的请求时,需要使用语句句柄,并调用SQLExecDirect或SQLExecute发出查询,服务端执行完成后查询的结果将保存在语句句柄中。
执行查询
调用DCIAllocHandle()函数获取语句句柄,使用DCIStmtPrepare预编译语句,使用DCIDefineByPos绑定缓冲区,然后调用SQLExecute执行查询,最后调用DCIStmtFetch获取结果集。
DCIStmt *stmthp; //语句句柄
text *sqlstmt=(text *)"select C1 from T2";
if(DCIHandleAlloc ((dvoid *) envhp, (dvoid **) &errhp, DCI_HTYPE_ERROR,
(size_t) 0, (dvoid **) 0))
{
printf("FAILED: DCIHandleAlloc()\n");
return DCI_ERROR
}
int *c1 = (int *) malloc (sizeof(int) * GET_ROWS);
DCIDefine *bndhp[0];
ub4 stmrow, stmrowEx;
DCIParam* colhd = NULL;
int i;
i = '+';
memset(c1, 0, sizeof(int) * GET_ROWS);
/*执行语句*/
DCIStmtPrepare(stmthp, errhp, sqlstmt, strlen((char *)sqlstmt), DCI_NTV_SYNTAX, 0);
if(DCIStmtExecute(svchp, stmthp, errhp, 0, 0, 0, 0, 0))
{
printf(“FAILED: DCIStmtExecute()\n");
}
/*绑定缓冲区到相对应的列上*/
if(DCIDefineByPos(stmthp, &bndhp[0], errhp, 1
(dvoid *)c1, (sb4)sizeof(int), (ub2)SQLT_INT,
(dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)DCI_DEFAULT))
{
printf("FAILED: DCIDefineByPos()\n");
return DCI_ERROR;
}
if (DCIDefineArrayOfStruct(bndhp[0], errhp, sizeof(int), 0, 0, 0))
{
printf("FAILED: DCIDefineArrayOfStruct ()\n");
return DCI_ERROR;
}
/*获取结果*/
If(DCIStmtFetch(stmthp, errhp, GET_ROWS, DCI_FETCH_NEXT, 0))
{
printf("FAILED: DCIStmtFetch ()\n");
return DCI_ERROR;
}
执行更新
要更改数据(执行一个insert,update或者delete),可以使用bind的方式绑定参数后再执行。
插入
DCIStmt *stmthp; //语句句柄
text *sqlstmt=(text *)”insert into T2(C1) values(:a)”;
if(DCIHandleAlloc ((dvoid *) envhp, (dvoid **) &errhp, DCI_HTYPE_ERROR,
(size_t) 0, (dvoid **) 0))
{
printf("FAILED: DCIHandleAlloc()\n");
return DCI_ERROR
}
int custno = 9;
DCIStmtPrepare(stmthp, errhp, sqlstmt, strlen((char *)sqlstmt), DCI_NTV_SYNTAX, 0);
if(DCIBindByName(stmthp, &bnd1p, errhp, (text *) “:a”,
(sb4) -1, (dvoid *) &custno,
(sb4) sizeof(int), SQLT_INT,
(dvoid *) 0, (ub2 *)0, (ub2 *)0, (ub4) 0, (ub4 *) 0,
(ub4) DCI_DEFAULT))
{
printf(“FAILED: DCIBindByName()\n”);
return DCI_ERROR;
}
if(DCIStmtExecute(svchp, stmthp, errhp, 0, 0, 0, 0, 0))
{
printf(“FAILED: DCIStmtExecute()\n”);
}