一直没做过直接访问数据库的项目,以前自己服务端的数据都是存在.db文件中,这次突然提出要跨平台访问sqlserver2008,原本以为很好处理,结果鼓捣好多天也没搞定。
windows端还好说,网上现成的一大堆,关键是linux端。网上查资料最多的都是关于freetds,而且大部分都是安装以及配置文件等,最烦这种配置。没办法,烦,也得硬着头皮做。
首先下载了freetds-0.91版本,搞了两天在linux下也能访问到数据库了,具体操作网上一大堆,我这里想说的是如果要连接sqlsever2008 freetds-0.91版本不够用,最少需要0.95版本,参考https://blog.csdn.net/21aspnet/article/details/47451253这篇文章可以先熟悉下freetds怎么在linux下使用。
各版本freetds下载地址:http://mirror.pnl.gov/macports/distfiles/freetds/
下载慢的可以点击【下载】
以上只是说明了怎么用,但是没有没有说明怎么在代码中进行体现,下面一一进行说明。
linux下:下载好freetds后进入主目录,./configure make make install 后找到编译生成的 libsybdb.a 文件;
windows下:使用cmake工具打开主目录下CMakeLists文件选择生成路径,点configure然后选择平台再点generate完成后在生成目录取出libsybdb.lib和libsybdb.dll下载
以上两步完成基本上就可以了,没必要在按网上说的要配置freetds.config文件之类的。
下边就是代码咯:【C++工程下载】
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include "sqldb.h"
#include "sqlfront.h"
#include "sybdb.h"
#include <locale.h>
int main(void)
{
char szUsername[32] = "sa";
char szPassword[32] = "123456";
char szDBName[32] = "test";
char szServer[32] = "192.168.80.30:50283"; //服务器ip地址和端口号
//初始化db-library
if (dbinit() == FAIL)
return 0;
//连接数据库
LOGINREC *loginrec = dblogin();
if (loginrec == nullptr)
return 0;
DBSETLCHARSET(loginrec, "GBK");//linux下改为UTF-8
// 设置登录的用户名
DBSETLUSER(loginrec, szUsername);
// 设置登录密码
DBSETLPWD(loginrec, szPassword);
// 连接sqlserver服务器地址和端口号,这里才是连接
DBPROCESS *dbprocess = dbopen(loginrec, szServer);
if (dbprocess == FAIL) {
printf("Connect MSSQLSERVER fail\n");
return 0;
}
else {
printf("Connect MSSQLSERVER success\n");
}
// 连接数据库
if (dbuse(dbprocess, szDBName) == FAIL) {
printf("Open data basename fail\n");
}
else {
printf("Open data basename success\n");
}
// 查询数据库中表中的内容
dbcmd(dbprocess, "select * from student"); //查询数据表中的内容,更具实际情况更改数据表名称
// 执行命令
if (dbsqlexec(dbprocess) == FAIL) {
printf("Query table error\n");
}
else
printf("Query table success\n");
DBINT result_code;
char szID[1024] = {0};
byte szBeginTime[1024] = {0};
char szDescription[1024]={0};
// 查看命令执行的结果。
while ((result_code = dbresults(dbprocess)) != NO_MORE_RESULTS)
{
if (result_code == SUCCEED) {
// 查询第1列
dbbind(dbprocess, 1, CHARBIND, (DBINT)0, (BYTE*)szID);
// 查询第2列
dbbind(dbprocess, 2, STRINGBIND, 0, szBeginTime);
// 查询第3列
dbbind(dbprocess, 3, CHARBIND, (DBCHAR)0, (BYTE*)szDescription);
// 跳到下一行
while (dbnextrow(dbprocess) != NO_MORE_ROWS) {
// 打印本行的数据
//printf("ID=%s\n", szID);
printf("szAid=%s\n", szBeginTime);
//printf("szBeginTime=%s\n", szDescription);
//每个循环都要清理缓存 否则会出现多余部分乱码
}
}
}
//关闭数据库连接
dbclose(dbprocess);
return 0;
}
网上放出的代码有两个地方需要注意
1. DBSETLCHARSET(loginrec, "GBK");//linux下改为UTF-8
好多地方没有加入这一句导致数据库读取的数据大多为乱码。
2.数据库每读一行的时候需要对缓存进行清理,要不然会出现部分乱码的问题,比如上一条内容为:”大家好才是真的好“
而本条内容为:”你吃饭了吗?”实际输出为:
1:大家好才是真的好 (没错误)
2:你吃饭了吗?@#¥#(符号代表乱码)
没请缓存的原因。具体操作用memset(szAid,0,sizeof(szAid)/sizeof(char));
如果自己没有兴趣编译的可以下载编译好的库(windows端和linux端都有)、头文件以及测试工程。下载