毕设进程:后端连接到PostgreSQL数据库

公交站点和公交路线信息录入完毕之后,可以在Geoserver上面进行预览(Geoserver在打开的时候可能你保存过登陆信息,可以自动以admin的身份登陆,但是它的数据存储却不是自动开启的,需要手动输入postgreSQL的登录名、密码来启用数据存储,接着才能预览这个数据存储中的图层)。另外,Geoserver上预览图层的时候,只能预览单一图层,想要同时预览两个图层的话,可以新建图层组,然后添加图层,计算边界,完成。还可以对图层的样式进行修改,在style那边可以看到已有的style类型,还有下面的HTML代码,可以通过编程的形式自己写一个样式应用到图层中,也可以使用udig好像,这个东东进行可视化的样式修改,它会自动生成样式,供导入到geoserver上使用。burg是红旗点,还有红色的路线,还有标志不同级别区域的样式,比较丰富!

后端怎样连接到数据库,然后进行算法编写和交互呢?

之前打电话问的同学,她用的SQLserver和VS,那边程序连接到数据库有两种方式,一个是在VS中设置连接到SQLserver数据库,一个是自己写语句连接数据库。另外不是还有个动态数据库么。但是我木有找到连接PostGIS的,问了大神,大神说用啥啥啥,我不会弄,也不记得了。后来在PostgreSQL官方文档中看到了连接方式,它有自己提供的C编程接口:Libpq库。接着就是在VS中的一通设置,这个设置也为难死我了,各种找,脑子里连个关键词都没有。后来在一个求助帖子中看到别人的回复,才设置成功的。

怎样连接Libpq库?

搜“VS如何连接到外部库” 需要修改“项目”中的“属性”:

配置属性->VC++目录->包含目录(添加....PostgreSQl\9.3\include),库目录(添加.....PostgreSQL\9.3\lib)

C和C++->常规->附加包含目录(添加PostgreSQL\9.3\include)

链接器->常规(添加include again),->输入(添加lib\libpq.lib)


接着应该就可以使用Libpq中的函数了。

数据库连接函数:

/*建立连接*/
PGconn* conn=PQconnectdb("host=localhost port=5432 user=postgres password=niguanwoa dbname=osm2 options='-c client_encoding=GBK'");

还有其他函数可以进行连接的,有的有自己默认的参数顺序。

用PQfinish来结束与数据库的连接。

连接完成之后向数据库传输查询语句:

PGresult* res=PQexec(conn,"SELECT ....."); 引号内就是你想在数据库中执行的SQL语句

PQclear(res)释放这个查询结果。

PQexec这个函数是不可以传参数的,但是编程中会经常使用到传参,比如i=0到n 查i点到某固定点的距离,就需要传参数了:

res=PQexecParams(conn,"SELECT ST_Distance((SELECT way FROM planet_osm_station WHERE station_id=$1),(SELECT way FROM planet_osm_station WHERE station_id=1)) ",

1,

NULL,

paramValues,

NULL,

NULL,

0);

paramValues是 char**类型的参数,在定义的时候是这样定义的:

paramValues: char* paramValues[1];

给paramValues赋值的时候也卡了好久,想传进去的数值在调试的时候发现,执行PQexecparams之前还是正确的,但是一执行paramValues里的值就变了,当然这个查询也是失败的。究其原因,感觉是自己指针和数组分不太清,学的不牢靠,然后就乱了。

首先需要说的是,想穿进去的参数是十进制的数值,但是paramValues的类型却是char**,定义的时候是一个指向数组的指针,我理解的就是paramValues[0]就是一个数组类型,又因为是char,所以我认为就是存放一个字符串的,这就需要你先把数字变成字符串,我自己写了一个转换函数,可以把较小的数值转换成字符串,但是总之传过去总是错的。

解决:

数字和字符串之间的转换方式:

数字转换成字符串:

int a;char a_s[10];

itoa(a,a_s,10);

a_s里面装的就是a的字符串形式了


字符串转换成数字:

a=atoi(a_s);


在网上还看到了其他的转换方式,还有sprintf 和sscanf来做的,但是我用在我这边,不知道哪一步或者哪一个变量的定义有问题,还是不能用,后来就用的itoa  atoi

(#include <winsock.h>)


这样处理了之后,paramValues[0]=a_s;就可以顺利的传值了。


怎样检查SQL语句执行的状态?

一般可以在执行完一个查询语句之后,接着:fprintf(stderr,"%s",PQerrorMessage(conn));

如果没有出错就不会打印出信息,出错了的话会告诉你详细的信息,如返回的结果行数-1,或者主键值113已经存在。


用完之后记得在合适的位置PQclear(res);





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值