C语言嵌入Informix数据库编程入门与完整示例

凌晨两点半
凌晨两点半
发布时间:2026-10-14 | 2人浏览过
原创

本文详细讲解如何在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 扩展名。

  1. 预处理:由 esql 编译器根据 .ec 文件生成标准的 .c 中间文件。
  2. 编译:使用系统指定的C编译器(如 gcc 或 g++)将 .c 文件编译为目标文件 .obj 或 .o。
  3. 链接:连接目标文件和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)来处理:

  1. 定义游标:EXEC SQL declare cursorname cursor for select ...;
  2. 打开游标:EXEC SQL open cursorname;
  3. 获取数据:EXEC SQL fetch cursorname;
  4. 释放资源: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资料的关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表