设为首页 加入收藏

TOP

C语言访问INFORMIX数据库 ― SQLDA使用(四)
2014-11-23 23:24:24 来源: 作者: 【 】 浏览:4
Tags:语言 访问 INFORMIX 数据库 SQLDA 使用
rt_size = sqlvar->sqllen;
}

/* 1. 为存放TEXT或BYTE列数据申请空间 */
loc = (loc_t*)calloc(1, alloc_size);
if(NULL == loc)
{
return -1;
}
sqlvar->sqldata = (char *)loc;

/* 2. 初试化loc_t结构 */
byfill(loc, alloc_size, 0);

for(idx=0; idx {
loc->loc_loctype = LOCMEMORY;
loc->loc_bufsize = DB_IFX_BLOB_SIZE;

loc->loc_buffer = (char *)calloc(1, DB_IFX_BLOB_SIZE);
if(NULL == loc->loc_buffer)
{
return -1;
}

loc->loc_oflags = 0;
loc++;
}

return 0;
}
代码说明:
1. 由申请的空间大小的值,可以发现当取多行数据时,同一列的结果值在内存空间是并排存放的。其内存结构图:

图2 结果集存储结构图

图2说明:

1. 图上每个格子代表一列数据

2. 行列关系:

A:处在第一个sqlvar_struct中的结果集sqldata中第一列代表第一行第一列,第二列代表第二行第一列,第三列代表第三行第一列,....,以此类推;

B:处在第二个sqlvar_struct中的结果集sqldata中第一列代表第一行第二列,第二列代表第二行第二列,第三列代表第三行第二列, ...,以此类推;

C:依照AB的规律可推出其他的行列关系

3. 获取数据

在执行FETCH后,结果集就会存放在sqlda之中,应用程序如何通过行号-列号 或 行号-列名获取对应列的取值呢?可通过如下方式:

代码段六:

[cpp]
/* 根据行号+列号从结果集中取数据 */
char *db_ifx_get_data_by_idx(int row, int col, void *cntx)
{
ifx_sqlda_t *current = NULL;
struct sqlvar_struct *sqlvar = NULL;
db_ifx_cntx_t *context = (db_ifx_cntx_t *)cntx;

if(NULL == context->result
|| NULL == context->result->sqlvar
|| col <= 0
|| col > context->result->sqld
|| row <= 0
|| row > context->rows)
{
return NULL;
}

/* 1. 定位列 */
sqlvar = context->result->sqlvar+col-1;

/* 2. 返回结果 */
return db_ifx_get_value(sqlvar, context, rowno);
}
代码段七:

[cpp] view plaincopy
/* 通过行号+列明从结果集中取数据 */
char *db_ifx_get_data_by_name(int rowno, const char *name, db_ifx_cntx_t *context)
{
int idx = 0;
struct sqlvar_struct *sqlvar = NULL;
if(NULL == context->result
|| NULL == context->result->sqlvar
|| rowno <= 0
|| rowno > context->rows)
{
return NULL;
}

/* 1. 定位列 */
sqlvar = context->result->sqlvar;
for(idx=0; idxresult->sqld; idx++)
{
if(0 == strcasecmp(name, sqlvar->sqlname))
{
break;
}
sqlvar++;
}

if(idx == context->result->sqld)
{
return NULL;
}

/* 3. 返回结果 */
return db_ifx_get_value(sqlvar, context, rowno);
}
代码段八:

[cpp] view plaincopy
/* 转换并以字符串形式返回结果集数据 */
char *db_ifx_get_value(struct sqlvar_struct *sqlvar, db_ifx_cntx_t *cntx, int rowno)
{
int ret = 0;
loc_t *loc = NULL;
char *data = sqlvar->sqldata + (rowno-1)*sqlvar->sqllen,
*convert = cntx->convert,
*pconvert = NULL;

memset(convert, 0, cntx->convert_size);

switch (sqlvar->sqltype)
{
case CBOOLTYPE:
{
snprintf(convert, cntx->convert_size, "%d", *((unsigned char*)data));
return convert;
}
case CSHORTTYPE:
{
snprintf(convert, cntx->convert_size, "%d", *((short*)data));
return convert;
}
case CINTTYPE:
{
snprintf(convert, cntx->convert_size, "%d", *((int*)data));
return convert;
}
case CLONGTYPE:
{
snprintf(convert, cntx->convert_size, "%l", *((long*)data));

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇防止对特定的函数下CC断点 下一篇C语言连接 Access 数据库

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: