QT unixODBC+freetds连接sqlserver并交叉编译移植到ARM上

最近产品需要做一个数据上传功能。客户要求直接写入SQLserver数据库。之前QT连接数据库是默认来年将诶sqlite数据库。由于sqlite是QT默认自带的操作起来比较简单,但是SQLserver QT没有带驱动所以需要安装驱动插件。下面我们来看一下是QT支持SQLServer所需要的插件。

一、unixODBC

二、QT的ODBC驱动

三、 FreeTDS

Ubuntu篇:

编译QT的ODBC驱动需要unixODBC,所以要先编译unixODBC

一、编译unixODBC

下载:http://pan.baidu.com/s/1hq25YjM

  1. tar -xzvf unixODBC-2.3.2.tar.gz  
  2. cd unixODBC-2  
  3. ./configure  --prefix=/usr/local/unixODBC
  4. ./make  
sudo make install

二、编译QT的ODBC驱动插件

下载QT源码:http://pan.baidu.com/s/1qW3BAEC

解压后进入:QTDIR/src/plugins/sqldriver/odbc/

qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc" odbc.pro

如果不成功,qmake用绝对路径如:/usr/local/Trolltech/QtEmbedded-4.7.1/bin/qmake "INCLUDEPATH+=/usr/local/unixODBC-arm/include" "LIBS+=-L/usr/local/unixODBC-arm/lib -lodbc" odbc.pro

编译完成后:将libqslqodbc.so 拷贝到QT的安装目录下的plugins/sqldriver里面。

此时在测试程序中可打印出:

说明QODBC驱动已经安装。

还有个简单的办法:

apt-get  install libqt4-sql-odbc

dpkg -L libqt4-sql-odbc


拷贝红框中的内容到QT的驱动目录下。

这是连接SQLServer会报错

 Can't open lib 'SQL SERVER' : file not found QODBC3: Unable to connect

这时候安装Freetds记好了。

三、FreeTDS的编译安装。

下载:http://pan.baidu.com/s/1o60XNQi

    cd freetds-0.9.1  
  1. ./configure --prefix=/usr/local/freetds  
  2. make 
sudo make install

安装好后还需要配置3个文件:

配置 /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                   #数据库监听端口

2配置  /usr/local/unixODBC/etc/odbcinst.ini

[FreeTDS]
Description             = FreeTDS unixODBC Driver

Driver          = /usr/lib/libtdsodbc.so.0

UsageCount              = 1

[SQL Server]
Driver          = /usr/local/ unixODBC/lib/libtdsodbc.so.0
UsageCount              = 1

3 配置 /usr/local/unixODBC/etc/odbc.ini

    testdsn]  # 数据源名称  
  1. Driver=FreeTDS# 指向odbcinst.ini的驱动配置  
  2. Description=MSSQL Server  
  3. Servername=testdsn # 数据源名称  
  4. Database=sqlscada    #数据库名称  
配置完成可以测试:

C/C++ code
 qDebug()<<QSqlDatabase::drivers();
 
    // 建立连接
    QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("testdsn");
    db.setUserName("sa");
    db.setPassword("xxxxxx");
 
    if(!db.open())
    {
        qDebug("=== %s",qPrintable(db.lastError().text()));
    }else
    {
        qDebug("==== ok");
    }
成功打印:==== ok
"insert into [table1] values('10.5','2.0','2014-11-12 16:01:15','keke')" 

如果不成功刻印用tsql测试一下:tsql -S 119.232.XXX.xxx -p 1433 -U sa -P XXXXXX -D ncpjgSys
tsql –S你的ip的名称 –U 数据库服务器连接用户名 –P 用户名对应的密码 –D 使用的数据库的名称


如果tsql可以而QT测试代码不行,那就是配置文件的问题,仔细检查配置文件的路径。也可用下面的代码测试。

    QSqlDatabase OpenDB()  
  1. {  
  2.     QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");  
  3.     // 注意,对于express版本数据库, 一定要加\\sqlexpress这种后缀  
  4.     QString dsn="DRIVER={SQL SERVER};SERVER=192.168.10.22\\sqlexpress;DATABASE=sqlscada";  
  5.     db.setDatabaseName(dsn);  
  6.     db.setUserName("sa");  
  7.     db.setPassword("scada");  
  8.       
  9.     if(!db.open())  
  10.     {  
  11.         qDebug("Error:%s",qPrintable(db.lastError().text()));  
  12.         return db;  
  13.     }  
  14. }  
ARM篇:

ARM需要移植就需要交叉编译;首先安装交叉编译器。根据板子具体定。接下还是三大步。

一、交叉编译unixODBC

./configure --prefix=/usr/local/arm/unixODBC --host=arm-linux   回车

4.#make

5.#make install

二、编译QT的 ODBC驱动:

/usr/local/Trolltech/QtEmbedded-4.5.3-arm/bin/qmake "INCLUDEPATH+=/usr/local/arm/unixODBC/include" "LIBS+=-L/usr/local/arm/unixODBC/lib -lodbc" odbc.pro注:这个qmake是QT交叉编译的。

三、交叉编译FreeTDS

./configure  --prefix=/usr/local/arm/freetds  --with-tdsver=7.1  --enable-msdblib  --disable-libiconv  --host=arm-linux

make

make install

四、拷贝文件:

/usr/local/arm/freetds 和/usr/local/arm/unixODBC打包拷贝到ARM的对应目录下(一定是对应目录即:/usr/local/arm/

也可适当裁剪。

libqsqlodbc.so库文件,将此库文件拷贝到ARM板子里的QT驱动目录下。



错误总结篇:

在移植的过程中遇到了各式各样的错误,汇总如下:

一、缺少QT的ODBC驱动插件

QSqlDatabase: QODBC driver not loaded 
QSqlDatabase: available drivers: QSQLITE 说明在连接odbc驱动的数据库时,缺少了libqt4-sql-odbc驱动包
解决办法:# sudo apt-get install libqt4-sql-odbc执行完重启后还是QSqlDatabase: QODBC driver not loaded 

QSqlDatabase: available drivers: QSQLITE

此时缺少QT的ODBC驱动插件虽然sudo apt-get install libqt4-sql-odbc安装了但还是找不到需要将libqsqlodbc.so拷贝到$QTDIR/plugins/sqldriver目录下。

二、缺少Freetds

("QSQLITE", "QODBC3", "QODBC", "QPSQL7", "QPSQL") 

=== [unixODBC][Driver Manager]Data source name not found, and no default driver specified QODBC3: Unable to connect
安装Freetds并配置:置文件没有配置好,配置好上面的三个文件。实在不行拷贝3个文件到/etc下

三、不执行SQL语句:

"insert into table1 values('10.5','2014-11-12 16:01:15','keke')" 
QODBCResult::exec: Unable to execute statement: "[FreeTDS][SQL Server]Invalid object name 'table1'." 

error==  

由于语句错误导致的。SQLserver在执行SQl语句时必须先加use database(database为数据库名)

四、编译Freetds时:make install时 arm-linux-ranlib:command not found

原因如下:

1.我添加arm交叉编译器目录到PATH中是放在//etc/profile里的,这是用户的配置文件,我的用户为yan。

2.执行make install时,加了sudo前缀,变成了root的工作环境和root的权限。

根据以上两点,make install是在root下做的,而arm-linux-ranlib在wmm用户的工作环境中才能找到。所以产生了这里的错误。

那我既要取得root权限,又要具有当前用户yan的工作环境,怎办呢?

解决如下:

执行make install之前,先用下sudo -i命令取得root权限。然后再执行make install。

su 和 sudo 的区别:

1.共同点:都是root用户的权限;

2.不同点:su仅仅取得root权限,工作环境不变,还是在切换之前用户的工作环境;sudo是完全取得root的权限和root的工作环境。

注意:sudo su切换到root时原用户的环境变量也一并丢失。应使用sudo -i

索性就手动添加PATH环境变量export $PATH=/opt/arm/4.3.2./bin:$PATH

然后make install,安装成功

五、  tsql: iconv.c:354: tds_iconv_open: Assertion `ret == 0' failed.

这种情况就是编码问题,解决方法:#./configure --enable-msdblib --prefix=/usr/local/freetds --with-tdsver=7.1 --disable-libiconv
重新编译下freetds,增加一个参数(红色字体的)
然后#make && make install

六、  Unable to connect: Adaptive server is unavailable or does not exist

 Unable to connect: Adaptive server is unavailable or does not exist.

       我的FreeTDS配置如下:

       [SQLSERVER]
       host = xxx.xxx.xxx.xxx
       port = 1433
       tds version = 8.0
       client charset = UTF-8

       看了不下N遍相关配置信息,没有任何问题。ldd了相关驱动文件,也没有任何连接库的问题。最关键的是,在这之几还成功过,百思不得其解。

       后面,把FreeTDS的调试日志功能打开:修改FreeTDS安装目录下etc子目录的freetds.conf文件,在“[global]”结点下有一行“; dump file = /tmp/freetds.log”,行首缺省用“;”屏蔽调试日志功能,把行首的“;”符号去掉,即可打开调试日志功能,然后保存退出。

       再用isql或者tsql进行连接数据库测试,结果肯定还是失败。然后cat调试日志文件(配置文件指定的/tmp/freetds.log文件),会发现有一行显示连接信息如下:

       Connecting to xxx.xxx.xxx.xxx port 4000 (TDS version 5.0)
       答案就在上面一行的红色加粗字符中。我的配置文件设置的TDS Version是8.0,调试日志打印的是5.0。我配置文件设置的端口号是1433,而调试日志打印的是4000。

        原来我的FreeTDS采用源代码编译安装,的进行configure未设置“--with-tdsver=8.0”选项,所以安装时缺省使用5.0,而5.0的缺省端口就是4000。知道了问题的原因后,一切就好办了。重新对FreeTDS进行configure;make;make install,configure时增加--with-tdsver=8.0选项。

--with-tdsver设置FreeTDS的版本,我这里设置了7.1是为了能连接SQL2005,网上有的文档说这里设置成8.0,但是我设置成8.0后编译出来的居然是5.0的,不知道什么原因,按这样设置成7.1编译出来的FreeTDS的版本就是7.1的

参考文章:/http://heyunhuan513.blog.163.com/blog/static/1602042201362921645593/
//http://www.2cto.com/database/201303/194968.html
//http://blog.163.com/e_rommel/blog/static/18738304520124234476314/
//http://tcspecial.iteye.com/blog/1972740
http://blog.chinaunix.net/uid-20680966-id-4425876.html
//http://www.oschina.net/question/565065_57069
http://www.linuxidc.com/Linux/2011-08/41198.htm
http://tech.rfidworld.com.cn/2014_09/b028d801fed451f5.html
http://china.ygw.blog.163.com/blog/static/6871974620117110752710/
http://www.linux521.com/2009/system/201204/16763.html

同时非常感谢

Qt/C++开发群
  259787236
 的落木和群主,他们很热心的帮助新人。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlalche...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中,相信很多人在sqlmap之osshell怎么使用问题上存在疑惑,小编查阅了各式资料,整理出
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册表读取等system。是mssql的最高权限db权限:文件管理,数据库操作等 users-administratorspublic权限:数据库操作 guest-users2、sql server注入执行命令查
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看实际数据库中发生了什么事情,有必要定期进行查询优化和索引否则会影响我们后期的SQL的查询速度。那么针对这样的问题我们必须要知道SQL执行的计划,在本文中winwin7小编给大家分享下SQL执
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点应用非常广泛。不过在使用中,我们会遇到非常多的错误,面对这么庞大的数据库环境,当然会有精确的错误代码的对照季,下面小编分享的
SQL Server本地账户无法登陆出现错误提示:error:40-Could not open a connenction to SQL Server的问题很常见,对于初学者来说可能不知道如何解决,一起来看看下面的解决方案。解决步骤如下:1、这种情况需要开启 SQL Server service
微软推出的SQL2008是一款非常好用的数据库软件,它稳定、功能强大,为众多企业提供了最佳的数据库解决方案,那么我们如何在Windows中安装它呢,一些朋友对SQL Server 2008的安装过程还不是很熟悉,下面就一起来看看SQL Server 2008详细安装图解...
本页概要如果您使用的是 SQL Server 2005备份和还原Sp_detach_db 和 Sp_attach_db 存储过程关于排序规则的说明导入和导出数据(在 SQL Server 数据库之间复
DBCC CHECKIDENT 检查指定表的当前标识值,如有必要,还对标识值进行更正。 语法 DBCC CHECKIDENT ( &#39;table_name&#39; [ , { NORESEED
这里对 SQL Server 字符串函数进行分门别类地列出,便于查阅和记忆,相信大家都在其它方面有高深的编程基础,从字面上来说大家都知道这些函数的意义,就不对这些函数作过多的解释了,主要谈些经验,具体
查询及删除重复记录的方法 1、查找表(people)中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select*frompeoplewherepeopleIdin(selectpe
微软发SQL Server 2008第二个CTP预览版from: http://news.csdn.net/n/20070807/107158.html8月7日消息,微软公司本周发布了SQL Serv
症状当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题。SQL Server 联机丛书中的孤立用户疑难解答主题中没有讲述解决此问题的具体步骤。本文介绍了如何解决孤立用户问题。更多信息虽然术
当登录SQL Server 2005时可能碰到错误: &#39;No Process is on the Other End of the Pipe&#39;。解决方法:(1)Open up SQL
概要本文描述如何映射标准登录和集成登录来解决在运行 SQL Server 的服务器之间移动数据库时的权限问题。更多信息当您将数据库从一个运行 SQL Server 的服务器移到另一个运行 SQL Se
----------------------------------------问题:该用户与可信的SQL SERVER 连接无关联使用sa用户或自建用户使用“SQL SERVER 身份认证”连接数据
更新日期: 2007 年 5 月 20 日 使用下表可以确定各种版本的 Microsoft SQL Server 2005 支持哪些功能。有关 SQL Server 2005 Enterprise E
当从Excel导入数据到Sql Sever中,可能会出现以下问题:&#xD;&#xA;对于指定的缓冲区大小而言,源列的数据太大