SQL Server只能在windows上运行, 在windows可以很轻松编译QODBC连接sqlserver数据库, 如何在linux连接sqlserver数据库. QT文档推荐用unixODBC来编译linux上ODBC驱动.
一. 编译unixODBC
wget ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.2.tar.gz tar -xzvf unixODBC-2.3.2.tar.gz cd unixODBC-2.3.2 ./configure ./make
二. 编译ODBC插件
2.1 进入QT源码后编译,编译完成后会在当前目录下产生 libqsqlodbc.so
cd $QTDIR/src/plugins/sqldrivers/odbc qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc" make
2.2 如果直接指定unixODBC源码目录("INCLUDEPATH+=/home/scada/unixODBC-2.3.2/include" "LIBS+=-L/home/scada/unixODBC-2.3.2/lib -lodbc")编译插件时,会出现下面的错误:
cannot convert parameter from 'sqlinteger *' to 'sqllen *', unixodbc_conf.h: No such file or directory
所以一定要先安装unixODBC, 才开始编译ODBC驱动
2.3 测试
这下驱动也有了,随便写个代码测试, 发现怎么都不能正常连接, 报错: Can't open lib 'SQL SERVER' : file not found QODBC3: Unable to connect
谷歌发现, 还需要安装FreeTDS,那个才是真正的驱动,unixODBC主要是用来编译插件的
三. 编译安装freetds
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-stable.tgz cd freetds-0.9.1 ./configure --prefix=/usr/local/freetds make install
四. 配置freetds
编译完成后,还得配置freetds相关参数才能运行, 这ODBC插件未免也太鸡肋了吧. 没办法 ,继续接着干 ...
4.1 配置 /usr/local/freetds/etc/freetds.conf
sudo vi /usr/local/freetds/etc/freetds.conf
#A typical Microsoft server
[testdsn] # SQL Server数据源名称,可以任意取有意义的名称
host=192.168.10.22 # 数据库主机
port=1344 #数据库监听端口
4.2 tsql工具测试数据库连接
运行 /usr/local/freetds/bin/tsql,
tsql –S 你的DSN的名称 –U 数据库服务器连接用户名 –P 用户名对应的密码 –D 使用的数据库的名称
数据源名称与配置文件一致: tsql -S testdsn -U sa -P sa -D test
五. 测试ODBC插件
5.1 配置 /usr/local/unixODBC/etc/odbcinst.ini
[FREETDS] Description=freetds driver Driver=/usr/local/freetds/lib/libtdsodbc.so #指定TDS驱动路径 Trace=yes TraceFile=/tmp/odbc.log # 启用ODBC日志记录
5.2 配置 /usr/local/unixODBC/etc/odbc.ini
[testdsn] # 数据源名称 Driver=FREETDS # 指向odbcinst.ini的驱动配置 Description=MSSQL Server Servername=testdsn # 数据源名称 Database=sqlscada #数据库名称
5.3 测试运行
qDebug()<<QSqlDatabase::drivers(); // 建立连接 QSqlDatabase db=QSqlDatabase::addDatabase("QODBC"); db.setDatabaseName("testdsn"); db.setPort(3304); db.setUserName("sa"); db.setPassword("sa"); if(!db.open()) { qDebug("=== %s",qPrintable(db.lastError().text())); }else { qDebug("==== ok"); } // 查询表auth_test QSqlQuery query(db); QString sql="select age from auth_test where id=:id"; query.prepare(sql); query.bindValue(":id",28); query.exec(); if(query.next()) { int age=query.value(0).toInt(); qDebug("Age is %d",age); }
运行结果:
上述截图发明,已经正常连接到数据库, 但是无法正常查询. 原来这取决于配置TDS版本,将TDS协议版本设置8.0即可
配置 /usr/local/freetds/etc/freetds.conf
[testdsn] tds version=8.0 #将默认的7.0改成8.0
再运行: