您的位置:首页 > 编程语言 > C语言/C++

C语言中使用ecpg访问Postgresql数据库

2010-10-25 21:11 176 查看
将SQL语句嵌入C代码中,然后通过 预处理器生成C编译的文件,最后执行编译。

一,编译

首先确定你的系统中装有开发包 dev-pg ,dev-ecpg. 可通过

$sudo apt-get install dev-pg,dev-ecpg 安装 。

将写入的源码以.pgc格式保存。比如,prog.pgc 执行命令:

$ ecpg -t prog.pgc

此时在当前目录下会生成prog.c的文件。开始 编译

$ gcc prog.c -o prog -I /usr/include/postgres/ -lpq -lecpg

二,连接数据库

URL:

<protocol>:<service>://<machine>:<port>/<dbname>as <connection name> as

<login name> using <password for login>

如:

exec sql connect to tcp:postgresql://localhost:5432/dbdemo as

connectname user 'noyear' using '123456';

这样完成对本地机子postgresql服务的dbname数据库的连接,用户为noyear,密码

123456;

三,sqlca

exec sql include sqlca

这条命令使得ecpg包含一个"sqlca.h"的头文件。其中包含sqlca结构体

struct sqlca

{

char sqlcaid[8];

long sqlabc;

long sqlcode;

struct {

int sqlerrml;

char sqlerrmc[70];

} sqlerrm;

char sqlerrp[8];

long sqlerrd[6];

char sqlwarn[8];

char sqlext[8];

};

在处理sqlca结构体时,首先检查sqlca.sqlcode,如果它小于零,说明出现了严

重错误;如果等于零,则一切正常;如果等于100则说明没有找到数据,但并不出

错。

如果INSERT,UPDATE或SELECT命令运行成功,则这些命令所影响的行数会保存在

sqlca.sqlerrd[2]中。

如果sqlca.sqlwarn[0]等于"W",说明有警告,通常是数据检索成功,但在转换成

主机变量时出了差错。

一旦出了错误, sql.sqlerrm.sqlerrmc能够提供错误描述信息。

四,其它;

在代码中

exec sql begin declare section;

int age;

VARCHAR name[50];

exec sql end declare section;

声明的age 和 name变量在C和SQL中都是可见的。在C中正常引用 ,但在SQL中要

使用要在变量前加“:”标志。如:

exec sql SELECT fname into :name FROM stu WHERE age = 22;

检索NULL值。

构建指示变量, int .

如 : int ind_stu_age;

当我们执行 FETCH命令由游标取回数据时,需要指定实际 变量和指示变量,中间

用冒号连接:

exec sql FETCH NEXT IN mycursor into :stu_age:ind_stu_age, :stu_name;

这样,如果ind_child_age的值为负,则表示 stu_age的数据是无意义的,即数据

库中对应的值为NULL。

五,实例:

#include <stdlib.h>

#include <stdio.h>

exec sql include sqlca;

exec sql begin declare section;

int stu_age;

VARCHAR stu_name[50];

int req_age;

exec sql end declare section;

main(){

exec sql connect to tcp:postgresql://localhost:5432/dbdemo as

connection user 'postgres' using '123456';

exec sql BEGIN WORK;

stu_age = 10;

exec sql DECLARE mycursor CURSOR FOR SELECT age ,name FROM stu WHERE

age > :stu_age;

exec sql OPEN mycursor;

exec sql FETCH NEXT IN mycursor into :stu_age, :stu_name;

if (sqlca.sqlcode < 0)

printf("error code %d ,message %s ,rows %d ,waring %c

\n",sqlca.sqlcode,

sqlca.sqlerrm.sqlerrmc, sqlca.sqlerrd[2],sqlca.sqlwarn[0]);

while (sqlca.sqlcode == 0 ){

if(sqlca.sqlcode >= 0) {

stu_name.arr[sizeof(stu_name.arr)-1] = '\0';

printf("Stu name and age %s ,%d \n",stu_name.arr, stu_age);

}

exec sql FETCH NEXT IN mycursor into :stu_age,:stu_name;

if(sqlca.sqlcode < 0) {

printf("error code %d, message %s, rows %d, warning %c

\n",sqlca.sqlcode,

sqlca.sqlerrm.sqlerrmc,sqlca.sqlerrd[2],sqlca.sqlwarn[0]);

}

}

exec sql CLOSE mycursor;

exec sql COMMIT WORK;

exec sql disconnect all;

return EXIT_SUCCESS;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息