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

 将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;
}

你可能感兴趣的:(数据库,C语言,PostgreSQL,访问,ecpg)