前言

照例废话几句,想玩下QT,但是学习吧总得想点事情做啊,单纯学习语法用法这些?反正我是学不下去的,脑袋一拍,就先学下怎么连接数据库吧!然而万万没想到,我这是给自己挖了一个深深的坑啊!

学习自然去官网教程咯,官网推荐使用unixODBC来连接,阔以,再一搜unixODBC,哟,这货还不能单独工作,需要和FreeTDS这个驱动配合才可以,那就开始整吧。那么问题来了,Linux下使用QT通过unixODBC+FreeTDS连接数据库的教程一搜一大把,尤其是CSDN,首页上基本全是CSDN的链接,为什么我要写这篇随笔呢,因为说句实话,CSDN上的这个方面的教程95%写的都是弟弟,写的根本不完整,按着去做根本用不了,很多关键的地方都省略了,不是少这个就是少那个,我一直觉得这是一种既想当bz,又想立牌坊的行为,想写点技术博客吸引下眼球,又怕徒弟学会饿死师傅,虚伪!更坑的是90%的文章都是你抄我我抄你,且是无脑抄,无力吐槽。如果上面的话刺痛了你,那拜托你去根据自己写的文章实践一下能不能用吧~

最后,这个随笔是基础环境的配置,而不是具体的代码(当然也有代码,只是很简单的代码),所以如果环境配好了就不用看了~

正题

最初我是根据网上搜的教程,自己编译和安装unixODBC和FreeTDS的,这里面就涉及到第一个坑:需要先安装unixODBC并且在编译FreeTDS时要指定unixODBC的安装路径,否则安装后没有驱动so包(官网上写的有,但是99%的教程都不会写这个坑)。

安装unixODBC

官网下载后,根据源码安装三步骤(configure/make/make install)安装即可,使用--prefix=/usr/local/unixODBC设置安装的路径,这个没啥说的。

安装FreeTDS

官网下载,安装依然是三步骤,但是如上所说,安装时一定要指定unixODBC的安装路径,人家官网上(传送门)写的清清楚楚,如果要配合unixODBC使用,必须要使用--with-unixodbc参数,那些写教程时没有指明这个参数的CSDN“大神”们,请你们告诉我你们怎么找到你们下面写的libtdsodbc.so这个包的?

所以根据以上的说法,最终编译时使用的参数如下:

  •     --prefix=/usr/local/FreeTDS (指定安装路径)
  •     --with-unixodbc=/usr/local/unixODBC (指定unixODBC安装路径)
  •     --disable-libiconv (禁用编码转换,这个设置与否影响不大)
  •     --enable-krb5 (启用kerberos验证,如果你使用域账号登录的话)

如上设置,在安装完的路径/usr/local/FreeTDS/lib下,才会有libtdsodbc.so包.

安装完毕后开始配置,默认配置文件在安装目录下的etc文件夹下,所以进入/usr/local/FreeTDS/etc下,修改FreeTDS.conf文件,添加如下配置:

这里我使用的是MSSQL 2016,TDS Version设置为7.0可以正常连接,但是这个我测试下来并不是特别关键,因为按照官网建议,如果是MSSQL 2016那应该是7.4,但是这设置为7.0也是可以正常连接的。究其原因,可能是FreeTDS可以自动选择该值,具体看下图:

可以看到,TDS Version是auto,所以这个值可能并不关键,当然如果你遇到了问题,或者是其它版本的MSSQL,可以参考官网的建议(传送门)。

配置文件修改完毕后在/usr/local/FreeTDS/bin下有tsql执行文件,执行如下命令:

./tsql -S ms -U sa -P xxxxx(MSSQL登录密码)

如果安装没问题,这里就能正常连接了,进入FreeTDS的命令模式,如下图:

选择数据库,使用sql语句即可查询。如果能正常查询,到这里FreeTDS的安装算是结束了,输入exit退出即可。

配置unixODBC

前面已经安装过了,在安装目录下的bin文件夹下,有个isql执行文件,可以用于测试。

unixODBC的配置文件有两个,在安装目录下的etc文件夹中,一个是odbc.ini,一个是odbcinst.ini,前者配置数据源,后者配置使用的数据库驱动,

配置odbcinst.ini

比较关键的是Driver参数,指定使用的驱动程序,Trace设置是否记录日志,TraceFile是日志文件存放路径。

配置odbc.ini

  • Driver:设置使用的驱动,对应odbcinst.ini中的驱动名字FreeTDS
  • Servername:指的是服务器,这个很关键,这个其实就是前面FreeTDS配置文件中添加的数据源的名字
  • Database:要连接的数据库名字

配置完毕,可以使用安装目录bin下的isql文件进行测试,执行如下命令:

bin/isql -v mssql sa xxxxx(数据库密码)

如果一切正常,可以进到unixODBC的交互窗口中,如下图:

这里我遇到了两个坑,耽误了我好长时间,说起来都是泪。

坑一:isql需要指定账密,配置文件中指定无效

最初依然是使用的CSDN上“大神”写的,直接使用bin/isql -v mssql,结果总是报错:

百思不得其解,最后查看FreeTDS的日志,发现是登录数据库时报错了:

这个错误是FreeTDS尝试使用Kerbores登录数据库,但是我编译时没有加—enable-krb5参数,所以提示这个问题,但是仔细一想也不对,应该使用账密登录啊,我根本没有配域账号,当然不能用域账号登录,于是我搜索能不能在配置文件中配置数据库的账密,根据unixODBC的配置(传送门)说明,可以在odbc.ini中配置数据库的登录账号和密码,如下图:

然而我配置完并没什么卵用,还是报上面一样的错误,最后发现必须在执行时把账密当参数传入才可以。

解决方案:在参数中指定用户名和密码

bin/isql -v mssql sa xxxx(数据库密码)

这个问题真是无力吐槽,浪费了我太多时间了。

坑二:找不到FreeTDS驱动,总是报错

这个坑毫无借鉴意义。。。。错误说的是没找到驱动,但我明明配置了啊,疯狂搜了半天,发现是自己写错了。。。。

Driver写成Drive你敢信?骂了半天原来自己才是那个SB- -

QT编译ODBC驱动

unixODBC和FreeTDS安装好后基础的驱动算是好了,下面就是通过QT进行连接和处理数据了,不过QT也需要自己的sql驱动才可以与unixODBC进行交互,所以还要安装QT的sql驱动。

安装这里的坑也不浅,不过我也不知道是谁的锅了。。。我最初安装QT时才刚接触Linux,是用Ubuntu的官方软件源安装的,安装完是5.9.5版本,根据官网的教程(传送门)去编译ODBC驱动,先下载了对应版本的插件源码(传送门),根据教程走到这一步时:

发现走不动,会报错,所以你说坑不坑?

最后怎么解决呢,继续进到子目录odbc,$QTDIR/qtbase/src/plugins/sqldrivers/odbc,在这里进行编译,执行如下命令:

之后make,这里会报错,少一堆的头文件,这里原因就是上面说的,Ubuntu官方的软件源中的安装包没有sql的相关头文件,但是前面下载的源码中都有,根据提示将头文件逐个放到qt的安装目录下,少的还挺多,总之一个个挨个复制就行了,如果你是官网下载的源码编译安装的或许没这个问题。根据提示全部将缺少的头文件复制进安装目录就可以编译成功,之后执行make install,会将sql的驱动自动移动到qt的安装目录下,到此环境终于是配置成功,满满的都是泪啊!!!

当一切尘埃落定,偶然看到有人说使用unixODBC是个超级麻烦,超级难配置的选择,原来我一下来就给自己定了个这么高的“小目标”啊。。。WTF!!!

代码

当环境配置完毕,代码就很简单了,新建个qt的控制台程序,在pro文件中加入sql库:

QT += sql

再在cpp中引入对应的头文件即可,完整代码如下:

#include <QCoreApplication>
#include <QtSql/QSql>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
#include <QVariant>
#include <QDebug> using namespace std; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
bool ok = QSqlDatabase::isDriverAvailable("QODBC3");
qDebug()<<ok<<endl;
QSqlDatabase db=QSqlDatabase::addDatabase ("QODBC3");
db.setDatabaseName("mss");
db.setPort();
db.setUserName("sa");
db.setPassword("his%2019"); if(!db.open ())
{
qDebug()<<"Database Open Error"<<endl;
qDebug()<<db.lastError().text();
}
else
{
QSqlQuery query=db.exec("SELECT TOP 5 * FROM doctor");
while(query.next())
{
qDebug()<<(query.value().toString())<<endl;
}
} return a.exec();
}

最后

拒绝做垃圾程序员,从认真做起!!!别除了抄还是抄,一点脑子都不动,还是转行吧,别给程序员丢脸了。

【戾气满满】Ubuntu 18.04使用QT通过FreeTDS+unixODBC连接MSSQL填坑记(含泪亲测可用)的更多相关文章

  1. Ubuntu 14.04风扇不停转,风扇狂转 的解决办法,亲测有效。

    Ubuntu 14.04风扇不停转,风扇狂转 的解决办法,亲测有效. 原文  http://ubuntuforums.org/showthread.php?t=2218367 楼主说:ubuntu 1 ...

  2. [转]QT子线程与主线程的信号槽通信-亲测可用!

    近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽 ...

  3. ubuntu 14.04中安装 ruby on rails 环境(填坑版) 呕血推荐

    环境:在win7 上Vmware虚拟机环境中安装的ubuntu 14.04 开发相关: ruby 2.2.0 rails 4.2.0 sublime text 3 本文说明:所有的命令均在$ 之后,若 ...

  4. Ubuntu 18.04 上使用xrdp远程桌面连接(Windows远程桌面连接)

    Ubuntu18.04设置#安装xrdpsudo apt-get install xrdp #安装vnc4serversudo apt-get install vnc4server tightvncs ...

  5. Ubuntu 18.04 上使用xrdp远程桌面连接

    参考:https://blog.csdn.net/qq_25556149/article/details/82216190 1,环境查看 2,安装 xrdp.tightvncserver apt-ge ...

  6. Ubuntu 16.04安装CrossOver容器来安装QQ(终极解决办法,亲测有效)

    说明:此版本的QQ基本完美,但是有个缺点就是历史记录有些会显示乱码! 注意:此方法能完美解决这篇文章http://www.cnblogs.com/EasonJim/p/7118693.html的所有问 ...

  7. Ubuntu 18.04及Snap体验——让Linux入门更简单(转))

    https://www.linuxidc.com/Linux/2018-06/152993.htm 初次听说过Linux的时候,是大一计算机课时候老师介绍说除了Windows还有Linux.Unix操 ...

  8. 笔记:在 Windows 10 WSL Ubuntu 18.04 安装 Odoo12 (2019-06-09)

    笔记:在 Windows 10 WSL Ubuntu 18.04 安装 Odoo12 原因 为了和服务器一样的运行环境. 使用 Ubuntu 运行 Odoo 运行更快. 方便使用 Windows 10 ...

  9. ubuntu 10.04 安装qt 5.0.2

    转自ubuntu 10.04 安装qt 5.0.2 从qt project网站下载下来最新的qt5.0.2套件,发现是个.run文件,添加x属性,然后直接sudo ./****.run, 提示  /l ...

随机推荐

  1. css隐藏页面元素的多种方法

    在平常的样式排版中,我们经常遇到将某个模块隐藏,下面我整理了一下隐藏元素的多种方法以及对比(有的占据空间,有的不占据空间.有的可以点击,有的不能点击.): ( 一 )  display:  none; ...

  2. 安装软件包的三种方法、RPM包介绍、rpm、yum工具用法、yum搭建本地仓库

    第5周第3次课(4月18日) 课程内容: 7.1 安装软件包的三种方法7.2 rpm包介绍7.3 rpm工具用法7.4 yum工具用法7.5 yum搭建本地仓库 7.1 安装软件包的三种方法 rpm工 ...

  3. 【云速建站】微信公众平台中维护IP白名单

    [摘要] 介绍获取接入IP白名单的操作步骤 网站后台对接微信公众号.支付等都依赖于白名单,接下来就介绍一下白名单的配置. 1.1      为什么要设置白名单 为了提高公众平台开发者接口调用的安全性, ...

  4. 还在用背单词App?使用Python开发英语单词自测工具,助你逆袭单词王!

    学英语广告 最近也许是刚开学的原因,不管是公众号,还是刷抖音,导出都能看到关于学英语.背单词的广告. 不知道现在学生们背单词买的什么辅导材料.反正我们上学那会,<星火阅读>特别的火.记得当 ...

  5. mybatis 和servlet使用MVC实现用户登录,注册,退出

    普通实现: USerMapper.java: package com.bjsxt.mapper; import org.apache.ibatis.annotations.Param; import ...

  6. [TimLinux] JavaScript 引用类型——Date

    1. Date var now = new Date(); // 不传参数,获取当前日期.时间. now.getDay(); // 日期 now.getMonth(); // 月份 now.getFu ...

  7. I_want_all 2019训练记录

    Team members StarHai binarycopycode Fly_White Caution 读题 数组第一维的访问速度比其他维速度快. 清空数组 乘法运算取模里面涉及到减法注意变为负数 ...

  8. 十大C++实战项目,你会几个?【高薪必备】

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:实验楼   市面上有很多C++的实战项目,从简单到进阶,学习每个项目都 ...

  9. Java中通过代码得到int类型数值的二进制形式

    一.完整代码 public class BigInteger { int sing; byte[] val; public BigInteger(int val){ // 将传递的初始值,按位取值,存 ...

  10. Shell排序 C&&C++

    Shell排序   Shell排序是大量数据需要排序时,更为高效的插入排序.它的算法思想基于插入排序的算法思想 流程: (1)将n个元素数组分成n/2个数字序列,第一个数据和第n/2个数据为一对,等等 ...