C语言嵌入Informix数据库编程入门与完整示例
本文详细讲解如何在C语言程序中嵌入Informix数据库接口(ESQL/C)。内容涵盖开发环境的变量配置、预编译至链接的三步构建流程、必要的Makefile编写,以及包含数据插入和游标查询功能的完整代码示例。
环境准备与安装配置
在Linux系统中安装好Informix数据库服务器后,为了能够进行E SQL/C开发,需要配置相应的环境变量,以确保编译器能找到头文件和库文件。
第1步:设置Informix环境变量
在用户的shell配置文件(如 .bashrc 或 .profile)中添加以下内容,确保库路径正确:
export LD_LIBRARY_PATH=$INFORMIXDIR/lib:$/INFORMIXDIR/lib/esql:$LD_LIBRARY_PATH;
执行 source .bashrc 使其生效。注意,某些版本可能需要根据实际安装路径调整 $INFORMIXDIR 的值。
ESQL/C 程序的构建流程
E SQL/C 程序的开发不同于纯C程序,它需要经过预处理、编译和链接三个步骤。源文件通常使用 .ec 扩展名。
- 预处理:由
esql编译器根据.ec文件生成标准的.c中间文件。 - 编译:使用系统指定的C编译器(如
gcc或g++)将.c文件编译为目标文件.obj或.o。 - 链接:连接目标文件和Informix静态库文件,生成最终的可执行文件。
必须为 $CC 指定合适的编译器,并确保链接时指向正确的库目录。
第2步:编写 Makefile
一个典型的 Makefile 如下,重点在于使用 esql 进行编译和链接,并指定头文件路径和库路径:
CC=gcc
exec01: exec01.o
esql -o exec01 -L$(INFORMIXDIR)/lib exec01.o
exec01.o:
esql -c -I$(INFORMIXDIR)/incl/esql exec01.ec
clean:
rm -f exec01 *.o exec01.c exec01
上述规则中,esql -c 用于仅进行预处理和编译,esql -o 用于最终链接。
ESQL/C 核心语法与数据结构
在C代码中嵌入SQL语句前,通常需要定义数据声明段,以便将C变量映射到数据库字段。
第3步:定义变量与连接数据库
常用语法结构包括:
- 包含头文件:
EXEC SQL include "dbdef.h"; - 定义常量:
EXEC SQL define MAXLEN 64; - 声明段:
EXEC SQL BEGIN DECLARE SECTION; char Fname[MAXLEN+1]; EXEC SQL END DECLARE SECTION; - 连接数据库:
EXEC SQL connect to 'dbname'; - 断开连接:
EXEC SQL disconnect current;
第4步:游标操作
对于查询结果集,通常使用游标(Cursor)来处理:
- 定义游标:
EXEC SQL declare cursorname cursor for select ...; - 打开游标:
EXEC SQL open cursorname; - 获取数据:
EXEC SQL fetch cursorname; - 释放资源:
EXEC SQL close cursorname;和EXEC SQL free cursorname;
判断操作是否成功需检查 SQLCODE 变量:
SQLCODE == 0:表示操作成功。SQLCODE == 100:表示查询结束(No data found)。
完整编程示例
以下是一个完整的 C 语言嵌入 Informix 的程序示例。该程序演示了从用户输入数据并插入表,再到通过游标读取该表数据的完整流程。
第5步:运行完整示例代码
源文件命名为 exec01.ec,主要逻辑如下:
#include <stdio.h>
#include <string.h>
#include <sqlca.h>
struct _db_person
{
char name[30+1];
char card[12+1];
int age;
};
// 去除字符串首尾空格的辅助函数
char *trim(char *str)
{
char *p, *buffer;
int len;
if( NULL!=str )
{
len = strlen(str);
if( len > 0 )
{
buffer=(char *)malloc(sizeof(char)*(len+1));
if( NULL != buffer )
{
memmove(buffer, str, len);
buffer[len]=0;
p = buffer + len - 1;
while( (p != buffer) && ((*p > 0x00) && (*p <= ' ')) )
*(p--) = 0;
p = buffer;
while( (*p > 0x00) && (*p <= ' ' ) )
p++;
strcpy(str, p);
free(buffer);
}
}
}
return str;
}
int GetData(struct _db_person *pps)
{
char strage[20];
memset(pps, 0, sizeof(struct _db_person));
printf("enter name<press enter only to exit>: ");
fgets(pps->name,sizeof(pps->name),stdin);
trim(pps->name);
if( strlen(pps->name) == 0 )
return -1;
printf("enter card no<press enter only to exit>: ");
fgets(pps->card,sizeof(pps->card),stdin);
trim(pps->card);
if( strlen(pps->card) == 0 )
return -2;
printf("enter age<press enter only to exit>: ");
fgets(strage,sizeof(strage),stdin);
trim(strage);
if( strlen(strage) == 0 )
return -3;
pps->age = atoi(strage);
return 0;
}
int main(void)
{
struct _db_person dbps;
database exec01;
if( SQLCODE != 0 )
{
printf("open demo1 failure,SQLCODE=%d\n",SQLCODE);
return -1;
}
while( 1 )
{
if( GetData(&dbps)<0 )
break;
insert into person(name, card, age) values(dbps.name, dbps.card, dbps.age);
printf("insert data result: SQLCODE=%d\n",SQLCODE);
declare vcursor cursor for select name, card, age into dbps.name, dbps.card, dbps.age from person;
printf("declare vcursor result: SQLCODE=%d\n",SQLCODE);
open vcursor;
printf("open vcursor result: SQLCODE=%d\n",SQLCODE);
if( 0==SQLCODE )
{
while( 1 )
{
fetch vcursor;
if( 0==SQLCODE )
{
printf("name=[%s],card=[%s],age=[%d]\n",dbps.name,dbps.card,dbps.age);
}
else
{
if( SQLCODE==100 )
printf("fetch end!\n");
else
printf("fetch failure!SQLCODE=%d\n",SQLCODE);
break;
}
}
}
close vcursor;
free vcursor;
}
disconnect current;
return 0;
}
此示例展示了如何绑定 C 结构体成员到 SQL 语句中的占位符(在 ESQL/C 中通常直接引用变量),以及如何管理游标的生命周期。请注意,实际使用中需确保数据库中存在对应的 person 表且字段类型兼容。
常用管理工具
除了代码开发,Informix 提供了命令行工具进行数据库管理:
- dbaccess:交互式SQL工具。
用法:dbaccess [dbname] - dbschema:查看或创建数据库模式。
用法:dbschema [-t tabname] -d dbname [filename]
以上就是C语言嵌入Informix数据库编程入门的详细内容,更多关于C语言连接Informix资料的关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













