跨平台使用Freetds访问sqlserver2008数据库

        一直没做过直接访问数据库的项目,以前自己服务端的数据都是存在.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端都有)、头文件以及测试工程。下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值