QT unixODBC+freetds连接sqlserver

      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

 

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

 

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

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

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

   再运行:

  

 

你可能感兴趣的:(sqlserver,FreeTDS,unixODBC,QODBC)