C语言访问INFORMIX数据库 — SQLDA使用

本文详细介绍了C语言通过SQLDA结构访问INFORMIX数据库的方法,包括DESCRIBE...INTO的用法,SQLDA的初始化过程,以及如何获取数据。文章通过代码示例分析了SQLDA在内存中的结构,解释了如何根据行号和列号或列名获取数据。
摘要由CSDN通过智能技术生成
               

1 前言概述

  动态SQL语句在编译时可能不知道有多少列信息。在ESQL语句中,这些不确定的数据是通过SQLDA完成的。理解SQLDA的结构是理解动态SQL的关键。SQLDA的结构可参考《C语言访问INFORMIX数据库 — SQLDA结构》,此篇主要通过代码来分析SQLDA的使用。[注意:此文是基于前一博文的补充,接口定义和类型定义请参考《C语言访问INFORMIX数据库 — 接口实现》]


2 用法分析

2.1 DESCRIBE ... INTO

  在接口实现中的db_ifx_mquery()函数中有这样一段代码:

    ifx_sqlda_t *sqlda = NULL;    ...    EXEC SQL DESCRIBE QUERY_SQLSTMT_ID INTO sqlda;    

代码段1

代码分析:

  定义变量sqlda为一个空指针,但执行DESCRIBE ... INTO后,就能对sqlda进行其他操作处理了。我想这时每个人看到这里心中都有一个疑问:DESCRIBE ... INTO到底对空指针sqlda做了什么处理?

  1) 分配空间

    1. 定义变量sqlda为空指针,但DESCRIBE...INTO之后就能够进行操作,很显然,DESCRIBE...INTO为变量sqlda分配了内存空间

    2. 分配的空间包括:sqlda和sqlda->sqlvar。且sqlda->sqlvar指向大小为sqld*sizeof(struct sqlvar_struct)内存块。(sqlvar:指向struct sqlvar_struct结构体,即指向描述第一列信息的sqlvar结构体)

    3. 但未给sqlda->sqlvar中其他指针分配内存

  2) 获取语句信息,并存放在ifx_sqlda_t结构中

    获取的语句信息包括:

    sqld:使用的sqlvar结构的个数,即:输出列的个数

    sqlvar:指向struct sqlvar_struct结构体,即:指向描述第一列信息的sqlvar结构体

    desc_name:sqlda名称

    desc_occ:sqlda结构的大小

    sqltype:代表参数或列的数据类型。它是一个整数数据类型代码。

    sqllen:代表传送数据的长度

    sqlname:代表列名或变量名

    有了以上的语句信息,就可以为后续数据行的空间分配提供依据。

    举例分析:

      假设需执行查询2列的SQL语句,在执行DESCRIBE...INTO后,变量sqlda的内存结构图为:

图1 变量sqlda的内存结构图

2.2 SQLDA初始化

/* 依据sqlda的信息,初始化其他数据 */int db_ifx_init_sqlda(db_ifx_cntx_t *context, ifx_sqlda_t *sqlda)int ret = 0,     idx = 0,     msg_len = 0,     row_size = 0,     alloc_num = 0struct sqlvar_struct *sqlvar = NULL;     context->result = sqlda; /* Step 1. 获取一行数据的长度 */ sqlvar = sqlda->sqlvar; for(idx=0; idx<sqlda->sqld; idx++, sqlvar++) {            /* 非C下一行数据的长度 */            msg_len += sqlvar->sqllen;         /* 为col->sqllen 重新赋值,该值是在C下的大小。   如:在数据库中的字符串,在C中应该多一个字节空间来存放NULL的结束符 */         sqlvar->sqllen = rtypmsize(sqlvar->sqltype, sqlvar->sqllen);            /* C下一行数据的长度 */            row_size += sqlvar->sqllen; }        /* Step2. 设置FetArrSize的值 */ if(FetArrSize < 0) {  if(FetBufSize <= 0)  {   FetBufSize = 4096; /* 默认值为4096 */  }  FetArrSize = FetBufSize/msglen; }     alloc_num = (FetArrSize <= 0)? 1:FetArrSize; /* Step3. 初始化列:列的取值分配空间等 */ sqlvar = sqlda->sqlvar; for(idx=0; idx<sqlda->sqld; idx++, sqlvar++) {  ret = db_ifx_set_sqltype(sqlvar);  if(ret < 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值