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.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

  1. cd freetds-0.9.1
  2. ./configure --prefix=/usr/local/freetds
  3. 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]

Description             = FreeTDS unixODBC Driver

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

UsageCount              = 1

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

  1. testdsn]  # 数据源名称
  2. Driver=FreeTDS# 指向odbcinst.ini的驱动配置
  3. Description=MSSQL Server
  4. Servername=testdsn # 数据源名称
  5. 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
-H 119.232.XXX.xxx -p 1433 -U sa -P XXXXXX -D ncpjgSys

tsql –H 你的ip的名称 –U 数据库服务器连接用户名 –P 用户名对应的密码 –D 使用的数据库的名称

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

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

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‘,‘2.0‘,‘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

的落木和群主,他们很热心的帮助新人。的

时间: 2024-10-13 11:00:06

QT unixODBC+freetds连接sqlserver并交叉编译移植到ARM上的相关文章

qt5.3.2移植到arm上出undefined reference to &#39;__sync_sub_and_fetch_4的错

qt5.3.2移植到arm上出undefined reference to '__sync_sub_and_fetch_4的错.解决办法如下, 使用工具:GCC4.4.1 QT源码:qt5.3.2 前提是确保你的工具已经安装成功了. 解决:1.下载gcc源码:我用的4.4.1解压,在gcc-4.4.3/gcc/config/arm/目录下找到一个linux-atomic.c:2.制作链接库:使用libtool制作,输入命令 libtool --tag=CC --mode=compile arm-

linux使用pyodbc和freetds连接sqlserver

安装unixODBC 使用pyodbc需要Linux上安装unixODBC 可使用yum或apt安装unixODBC-devel包 编译安装:http://www.unixodbc.org/download.html 安装成功验证 #odbcinst -j unixODBC 2.3.7 DRIVERS............: /usr/local/etc/odbcinst.ini SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini FILE DATA SO

Linux下通过ODBC连接sqlserver

1.需求: 最近有个需求就是要在linux下连接(可以执行sql语句)sqlserver 2.环境 操作系统:  Centos6.5 数据库:     SQLServer2014 数据库有用户admin,密码是123456,数据库库名是chzh 3.注意: MS从来没有提供过SQLServer for Linux,所以也不要去尝试在Linux系统安装SQLServer,但是可以通过ODBC连接Windows系统的SQLServer数据库: 4.所需软件包: Linux系统的ODBC unixOD

firedac使用UNIXODBC连接SQLSERVER

1)下载 SQL SERVER ODBC DRIVER FOR 64-BIT LINUX. 如果你有旧版mssql 工具安装,请删除任何较旧的 unixODBC 包. sudo yum remove unixODBC-utf16 unixODBC-utf16-devel 运行以下命令以安装mssql 工具使用 unixODBC 开发人员包. sudo yum install -y mssql-tools unixODBC-devel 2)创建一个 ODBC 数据源,配置文件在 /etc/odbc

QT显示中文 连接上文

1.首先是建立Linux开发环境1.1.在windowsXP下安装博创公司提供的虚拟机软件VMware Workstation,版本为VMware-workstation-full-7.0.1-227600,安装完成后进行汉化,由于要覆盖文件,所以要先在任务管理器中结束所有有关VMware的进程,然后将汉化文件覆盖到VMware的安装目录,至此VMware虚拟机软件安装完成.1.2.虚拟机软件安装成功后,就开始安装Linux操作系统,这里我使用的Ubuntu10.04长期支持版,可以到Ubunt

centos + php+ unixodbc + FreeTDS 配置

linux 上 php 连MSSQL,使用 unixodbc + FreeTDS 安装步骤: 安装unixODBC yum install unixODBC yum install unixODBC-devel 安装 FreeTDS ./configure --with-tdsver=8.0 --prefix=/usr/local/freetds --enable-msdblib --with-gnu-ld --enable-shared --enable-static make make in

asp.net 连接sqlserver数据库

在asp.net中连接sqlserver数据库之前,首先得确保正常安装了sqlserver2008,同时有数据库. 在项目中添加一个类DB,用来专门负责执行对数据库的增删改查.在添加的过程中会弹出下面的一个提示 直接点是就可以了. 在这个类中,首先定义一个连接对象 private SqlConnection conn = null;然后定义下面三个函数 private void SetConnection()//初始化连接对象 { if (conn == null) { //获取配置文件中的数据

U3d连接SQLServer数据库报错:由于目标计算机积极拒绝,无法连接。

   U3d连接SQLServer首先把Unity安装目录下的System.Data.dll拷到工程的Asset/Plugins目录下,然后编写连接数据库的脚本,在以上两个步骤无误的情况下,提示这个错误,要考虑SQLServer的相关服务有没有开启,同时要在SQLServer的配置管理器中启用TCP/IP协议,步骤如下 打开开始—程序—Microsoft SQL Server 2005—配置工具—SQL Server Configuration Manager-- SQL Server 2005

连接sqlserver

using System; using System.Data; using System.Data.SqlClient; namespace DBUtil { class Program { static void Main(string[] args) { //连接数据库 /** * 注意如果是本地数据库用Trusted_Connection=SSPI: * 是server的话用uid,pwd等账户密码进行验证 */ SqlConnection myCon = new SqlConnecti