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;
}
一,编译
首先确定你的系统中装有开发包 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语言 宏的概念和使用总结
- 编程精粹--编写高质量的C语言代码(2):自己设计并使用断言(一)
- C语言无法使用引用,一定要使用怎么办? ------指针的指针做参数
- linux下C语言中的flock函数使用方法 .
- C语言中const关键字使用方法及使用场景
- 【C语言复习(九)】条件编译的使用与分析
- 通过使用cJSON使得C语言支持JSON数据
- 关于C语言中getopt()函数的使用方法
- 使用c语言指针和递归方法实现二分查找
- C语言宏的使用
- [原]如何在C语言中使用正则表达式
- 基于C语言EOF与getchar()的使用详解
- C语言中指针变量使用时常见的几个问题
- 如何在64位的linux系统上使用汇编和C语言混合编程
- C语言实现求字符串的长度,不使用库函数
- Linux中使用C语言的fork()函数创建子进程的实例教程
- C语言集成开发环境vs2017的使用技巧之修改快捷键
- 使用C语言扩展Python(二)
- C语言的const关键字与指针搭配使用
- C语言getopt()函数的使用