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

    

QT unixODBC+freetds连接sqlserver_unixODBC

 

 五. 测试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);
}

    运行结果:

    

QT unixODBC+freetds连接sqlserver_freetds_02

 

    上述截图发明,已经正常连接到数据库, 但是无法正常查询. 原来这取决于配置TDS版本,将TDS协议版本设置8.0即可

     配置 /usr/local/freetds/etc/freetds.conf



[testdsn] tds version=8.0 #将默认的7.0改成8.0



   再运行:

  

QT unixODBC+freetds连接sqlserver_QODBC_03