15. 准备结果集ct_results()
CS_RETCODE ct_results(CS_COMMAND *cmd_ptr, CS_INT *result_type)
说明:
Result_type:输出变量,表示结果类型。包括:
结果集的类型 Result_type值 说明 结果集内容
命令执行状态 CS_CMD_DONE 表示一个命令已经正常结束 无
CS_CMD_FAIL 命令执行有错误 无结果集
CS_CMD_SUCCEED 成功执行一个无结果集的命令,如insert命令 无结果集
Fetch状态 CS_COMPUTE_RESULT 统计结果集行数 结果集行数
CS_CURSOR_RESULT Cursor的处理结果 结果集行数
CS_PARAM_RESULT 返回存储过程的出参 出参的数值
CS_STATUS_RESULT 返回存储过程的状态 状态
CS_ROW_RESULT 返回记录行供处理 0或多条记录
Eg: select …. From …
Order by …
Compute sum() by …
返回值
CS_SUCCEED:结果集已准备好,应用可用
CS_END_RESULTS:所有的结果都已处理完毕
CS_FAIL:执行出错,结果集中的结果无效。
CS_CANCELED:结果集被取消
CS_PENDING/CS_BUSY:
处理的方式为:
while ((result_ok=ct_results(cmd_ptr,&result_type)) == CS_SUCCEED)
{
switch ((int)result_type)
{
case CS_ROW_RESULT: /*普通行*/
1. 绑定输出列 ct_bind
2. 取出结果集 ct_fetch
break;
case CS_CMD_DONE: /*所有结果处理完毕*/
break;
case CS_CMD_SUCCEED: /*命令执行无错误*/
break;
case CS_CMD_FAIL: /*命令执行有错误*/
break;
case CS_PARAM_RESULT: /*对于rpc,捆绑及取出输出参数*/
1. 绑定输出列 ct_bind
2. 取出结果集 ct_fetch
break;
case CS_STATUS_RESULT: /*对于rpc,捆绑及取出返回状态*/
1. 绑定返回状态(只有一列)ct_bind
2. 取出返回状态值ct_fetch
break;
case CS_COMPUTE_RESULT: /*取出计算数据*/
break;
case CS_CURSOR_RESULT: : /*游标结果集数据*/
1. 绑定输出列 ct_bind
2. 取出结果集 ct_fetch
break;
default:
break;
}
}
/*命令结束处理*/
switch (result_ok)
{
case CS_END_RESULTS: /*所有结果处理完毕*/
{
ret_code=CS_SUCCEED;
break;
}
case CS_FAIL:
{
ret_code=CS_FAIL;
break;
}
default:
{
ret_code=CS_FAIL;
break;
}
}
各种操作的ct_results返回值与返回类型的各值次序
result=ct_results(cmd_ptr,&result_type)
正确操作 说明
Result_type Result
Select操作 1.CS_ROW_RESULT 1CS_SUCCEED 可取结果集:ct_bind/ct_fetch
2.CS_CMD_DONE 2CS_SUCCEED 命令执行成功
3CS_END_RESULTS 命令结束
Insert操作 1.CS_CMD_SUCCEED 1CS_SUCCEED Update与delete同insert一样
2. CS_CMD_DONE 2CS_SUCCEED
3CS_END_RESULTS
RPC 1.CS_STATUS_RESULT 1. CS_SUCCEED 先得到RPC的返回值:
ct_bind/ct_fetch
2.CS_PARAM_RESULT 2 CS_SUCCEED 再得到RPC出参值
:ct_bind/ct_fetch
3. CS_CMD_SUCCEED 3. CS_SUCCEED
4 CS_CMD_DONE 4. CS_SUCCEED
5CS_END_RESULTS
CURSOR 1 CS_CMD_SUCCEED 1. CS_SUCCEED 定义cursor
2 CS_CMD_DONE 2 CS_SUCCEED
3 CS_CMD_SUCCEED 3. CS_SUCCEED 打开cursor
4 CS_CMD_DONE 4. CS_SUCCEED
5CS_CURSOR_RESULT 5. CS_SUCCEED 处理结果集: :ct_bind/ct_fetch
6 CS_CMD_DONE 6. CS_SUCCEED
7CS_END_RESULTS
错误的操作都是一样:
Result_type Result
1.CS_CMD_FAIL CS_SUCCEED
2.CS_CMD_DONE CS_SUCCEED
CS_END_RESULTS
16. 释放一个COMMAND结构Ct_cmd_drop
CS_RETCODE ct_cmd_drop(CS_COMMAND *cmd_ptr)
返回值
CS_SUCCEED:结果集已准备好,应用可用
CS_FAIL:执行出错,结果集中的结果无效
CS_BUSY:
17. 获取结果集或命令信息ct_res_info()
CS_RETCODE ct_res_info(cmd_ptr, type, buffer, buflen , outlen )
CS_COMMAND *cmd_ptr
CS_INT type
CS_VOID *buffer
CS_INT buflen
CS_INT *outlen
说明:
Type:
Value of type 返回给buffer的值 Ct_results后的result_type参数值 Buffer类型
CS_CMD_NUMBER 产生结果集的命令条数 任意值 CS_INT
CS_NUM_COMPUTERS 当前命令的computer子句个数 CS_COMPUTER_RESULT CS_INT
CS_NUMDATA 结果集的项目个数或列个数 CS_COMPUTER_RESULT
CS_ROW_RESULT
CS_PARAM_RESULT
CS_STATUS_RESULT
CS_ROWFMT_RESULT CS_INT
CS_NUMBERCOLS Order-by的列数 CS_ROW_RESULT CS_INT
CS_ROW_COUNT 本次命令涉及的记录行数 CS_CMD_DONE
CS_CMD_FAIL
CS_CMD_SUCCEED CS_INT
CS_TRANS_STATE 当前的事务状态 任何值 CS_INT
Eg:
/*** Find out how many columns there are in this result set. */
retcode = ct_res_info(cmd, CS_NUMDATA, &num_cols, CS_UNUSED, NULL);
if (retcode != CS_SUCCEED)
{
ex_error("FetchComputeResults: ct_res_info() failed");
return retcode;
}
for (i = 0; i < num_cols; i++)
{
/*
** Get the column description. ct_describe() fills the
** datafmt parameter with a description of the column.
*/
retcode = ct_describe(cmd, (i + 1), &datafmt);
if (retcode != CS_SUCCEED)
{
ex_error("FetchComputeResults: ct_describe() failed");
break;
}
retcode = ct_bind(cmd, (i + 1), &datafmt,
coldata.value, &coldata.valuelen,
(CS_SMALLINT *)&coldata.indicator);
if (retcode != CS_SUCCEED)
{
ex_error("FetchComputeResults: ct_describe() failed");
break;
}
}
18. 获取数据每一列的描述ct_describe()
CS_RETCODE ct_describe(cmd_ptr , item, *datafmt)
CS_COMMAND *cmd_ptr
CS_INT item ------列或返回值的序号,从1开始
CS_DATAFMT *datafmt; ----数据属性格式
说明:
Datafmt会填写以下字段:
字段名 类型 值
name 列名
namelen
Datatype 列类型 CS_XXX_TYPE
Format Not used
Maxlength 最大长度
Scale
Precision 浮点
Status 浮点
Count
usertype
Locale
19. Ct_options
20. 将结果集绑定给输出变量ct_bind()
CS_RETCODE ct_bind(cmd_ptr, item, datafmt, buffer , copied , ind)
CS_COMMAND *cmd_pte
CS_INT item ----绑定的列或参数位置,从1开始,存储过程返回值则按出参顺序从1开始
CS_DATAFMT *datafmt
CS_VOID *buffer ---绑定的输出变量数级组(按列绑定 char aa[col][列的最大长度])
CS_INT *copied ----拷贝的地址或NULL
CS_SMALLINT *ind ----指示器或NULL
说明:
Datafmt成员设置:
Name:不设
Namelen:不设
Datatype:设置成对应的类型CS_XXX_TYPE
Format:除了binary, text, image外设置为CS_FMT_UNUSED
Maxlength:对于固定长度的列可忽略
Scale:用于浮点数
Precision:用于浮点数
Status:不设
Count:每次绑定的记录个数,一般为1
返回值:
CS_SUCCEED:执行成功
CS_FAIL:执行失败
CS_BUSY:在异步操作时表示本连接状态不可知
21. 向下取一条记录ct_fetch()
CS_RETCODE ct_fetch(cmd_ptr, type, offset , option , rows_read)
CS_COMMAND *cmd_ptr
CS_INT type ---CS_UNUSED
CS_INT offset ---CS_UNUSED
CS_INT option ---CS_UNUSED
CS_INT *rows_read ---一次fetch的行数
返回值:
CS_SUCCEED:本次fetch执行成功,读出的记录数为roaw_read
CS_END_DATA:全部数据fetch结束,应用程序应调用ct_results取下一个结果集
CS_ROW_FAIL: 一次处理中有部分记录是错误的,常用于数组绑定
CS_FAIL:操作失败
CS_CANCELED: 取消
CS_BUSY/CS_PENDING:在异步操作时表示本连接状态不可知
Eg:
While (((retcode = ct_fetch(cmd,CS_UNUSED, CS_UNUSED, CS_UNUSED,&rowsread)) == CS_SUCCEED)|| (retcode ==CS_ROW_FAIL))
{
If (retcode==CS_ROW_FAIL){printf(“error on row: %d”,rowsread);}
For (i=0; i
{
按列取得每一行记录;
}
}
Switch (retcode)
{
Case CS_END_DATA: retcode=CS_SUCCEED; break;
Default : retcode CS_FAIL; break;
}
22. 安装回叫函数Ct_callback()/cs_config()
CS_RETCODE ct_callback(cntx_ptr, conn_ptr, action , type , func)
CS_CONTEXT *cntx_ptr
CS_CONNECTIOn *conn_ptr
CS_INT action == CS_SET / CS_GET
CS_INT type
CS_VOID *func ----回叫函数名
CS_RETCODE cs_config(cntx, action , property, buffer , buflen, outlen )
CS_CONTEXT *cntx;
CS_INT action ; == CS_SET / CS_GET/CS_CLEAR
CS_INT property :设置的属性值
CS_VOID *buffer ----回叫函数名
CS_INT buflen; ---CS_UNUSED
CS_INT *outlen; ---- NULL
说明
Ct_callback用来设置ct_lib的回叫函数
Type名 说明
CS_CLIENTMSG_CB 客户端的消息处理
CS_SERVERMSG_CB server端的消息处理
Cs_config用来设置cs_lib的回叫函数
Property值 说明
CS_MESSAGE_CB CS的消息处理
返回值:
CS_SUCCEED:执行成功
CS_FAIL:执行失败
CS_BUSY:在异步操作时表示本连接状态不可知
23. 取消一个命令或清除一个结果集Ct_cancel()
CS_RETCODE ct_cancel(conn_ptr, cmd_ptr, type)
CS_CONNECTION *conn_ptr
CS_COMMAND *cmd_ptr
CS_INT type
说明:
1. 如果type= CS_CANCEL_CURRENT则conn_ptr=NULL
2. 如果type= CS_CANCEL_ALL则conn_ptr和cmd_ptr中有一个必须=NULL
Type 值
CS_CANCEL_CURRENT:仅取消当前的结果集,而不是整批数据。取消命令并没有被送到SQLServer。
CS_CANCEL_ALL::取消批命令中的所有结果。Server一收到取消命令,它就停止相应的处理工作。
24. 关闭一个连接ct_close()
CS_RETCODE ct_close(CS_CONNECTION *conn_ptr, CS_INT option )
Option:
=CS_FORCE_CLOSE:强制关闭
=CS_UNUSED:关闭前发消息给server等当前操作结束后关闭连接
返回值:
CS_SUCCEED:执行成功
CS_FAIL:执行失败
CS_BUSY:在异步操作时表示本连接状态不可知
CS_PENDING
25. 初始化一个cursor:ct_cursor()
CS_RETCODE ct_cursor(cmd_ptr, type, name, namelen, text , textlen , option)
CS_COMMAND *cmd_ptr
CS_INT type :初始化操作类型
CS_CHAR name :cursor名
CS_INT namelen :CS_NULLTERM
CS_CHAR *text ----cursor对应的SQL操作语句
CS_INT textlen :CS_NULLTERM
CS_INT option
Type值 说明 Name值 Text值 Option值
CS_CURSOR_DECLARE 定义一个cursor Cursor名 对应的SQL语句 CS_UNUSED:是否修改则服务器决定
CS_READ_ONLY:只读cursor
CS_FOR_UPDATE:可修改cursor
CS_CURSOR_OPEN 打开一个cursor NULL NULL 首次打开时CS_UNUSED
CS_CURSOR_CLOSE 关闭 NULL NULL CS_UNUSED:只关闭cursor
CS_DEALLOC:关闭cursor同时释放资源
CS_CURSOR_OPTION 设置cursor属性 NULL NULL CS_UNUSED
CS_CURSOR_ROWS 设置cursor一次处理的行数 NULL NULL 一次处理的行数
CS_CURSOR_DELETE Cursor执行删除操作 对应的表名 NULL CS_UNUSED
CS_CURDOR_UPDATE Cursor执行修改操作 对应的表名 SQL语句 CS_UNUSED
CS_CURSOR_DEALLOC 释放一个cursor NULL NULL CS_UNUSED续