开发板远程操作SQL SERVER解决方案
环境:
开发板:freescale 2.6 armv71,系统只读,唯一可以读写的路径是/tmp/sd(这是一个sd卡)。程序放在/tmp/sd/transfer下(下文以运行路径代替),sql语句以文件形式保存在开发板上,语句字符集是GBK。
服务器:服务器安装的是SQL SERVER 2008。
功能:程序能够连接上服务器的数据库,执行SQL语句等等。
考虑到开发板的sd卡容量有限,不便于安装编译器,于是决定交叉编译。
交叉编译环境:ubuntu 12.04 (也可以选择其他的)。待编译的transfer.c和transfer.h文件放在/home/arm下(下文以编译路径代替)
首先安装交叉编译器,去官网下载最新的arm-linux-gcc。
我使用的是arm-linux-gcc-4.4.3-20100728.tar.gz,下载之后解压即可使用(我解压到了/home/下)。
为了使用方便,将解压目录下的opt/toolschain/4.4.3/bin添加到系统环境变量中。
为了访问SQL SERVER,我们需要安装freetds。当然这个freetds编译出来的动态库也必须是要在开发板使用的,所以要使用交叉编译器编译
去官网下载最新的freetds-stable.tgz.tgz,下载完成后解压,然后进入解压目录
执行以下命令
./configure --prefix=/home/freetds-arm --sysconfdir=/tmp/sd/transfer --with-tdsver=7.1 --enable-msdblib --disable-libiconv --host=arm-none-linux-gnueabi
解释下各项参数的意义。
--prefix=/home/freetds-arm ,设置freetds安装的目录,考虑开发板上是只读的,所以最好自己手动指定链接库路径而不采用默认路径。另外个原因这是ubuntu,而编译出来的是arm版本的。
--sysconfdir=/tmp/sd/transfer ,如果确定SQl语句不使用中文,可以不要这个参数。这个参数设置freetds配置文件的路径。(默认是在prefix指定的路径下的ext文件夹)。为什么要单独把参数文件夹设定为/tmp/sd/transfer,下面再讲
--with-tdsver=7.1 ,设置tds协议的版本,适用于SQL SERVER2008。其他版本请自行修改版本号
--enable-msdblib,允许MS(微软)数据库连接,因为还有其他数据库使用tds协议。
--disable-libiconv,关闭字符集自动转换(不关闭的话会中文乱码)
--host=arm-none-linux-gnueabi,指定交叉编译器(如果之前没有设定系统环境变量的话这里要手动指定编译器路径)
然后
make
make install
解决中文乱码
freetds连接默认是采用ISO-8859-1编码,是不支持中文的。在freetds安装目录下的ext文件夹(如果使用--sysconfdir,就在其指定的路径下)里有个freetds.conf,可以设置连接字符集。方法是在[global]条目下添加一行client charset=GBK(假设你的sql语句是GBK格式的,其他格式请使用对应的字符集)。
不过在板子上使用异常,莫名其妙程序崩溃。后来查看freetds源代码,发现默认支持UTF-8。
于是首先将client charset=GBK改为client charset=UTF-8,然后将SQL语句从GBK格式转换成UTF-8格式即可
这里使用libiconv来进行转换(还用其他方法,请参考网络)
要包含头文件iconv.h
void GBK_To_UTF8(char * src,int srclen,char * dsc,int dsclen)
{
iconv_t cd;
cd = iconv_open("UTF-8","GBK");
memset(dsc,0,dsclen);
iconv(cd,&src,&srclen,&dsc,&dsclen);
iconv_close(cd);
}
当然libiconv也得使用交叉编译
首先下载libiconv-1.14.tar.gz,解压之后进入解压目录
./configure --prefix=/home/libiconv --host=arm-none-linux-gnueabi
make
make install
参数含义不多做解释,参考上文。
安装完成从安装目录找到libiconv.so.2.5.1,复制到编译目录并改名为libiconv.so.2
从安装目录下找到iconv.h,复制到编译目录下
编写Makefile文件如下
CC=/home/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-gcc
CCD=gcc
FLAGS=-Wl,-rpath=/tmp/sd/transfer -I/home/freetds-arm/include/ /home/freetds-arm/lib/libsybdb.a librt.so libiconv.so.2
FLAGSD=-I/home/freetds/include/ /home/freetds/lib/libsybdb.a -lrt -liconv
transfer : transfer.c transfer.h
$(CC) -o transfer -g transfer.c $(FLAGS)
debug : transfer.c transfer.h
$(CCD) -o transferd -g transfer.c $(FLAGSD)
clean :
rm -rf *~ transfer transferd
执行make就可以得到transfer,这个是要放到板子上用
执行make debug就可以得到transferd,这个直接可以在ubuntu上用,方便调试
为了方便在ubuntu12.04使用gdb调试,增加了debug目标,freetds等的安装方法参考上文,只需要去掉--host=arm-none-linux-gnueabi。
解释下
FLAGS
-Wl,-rpath=/tmp/sd/transfer表示程序执行的时候优先从这个路径寻找依赖库,如果不使用此项,会报libiconv.so.2找不到。
-I/home/freetds-arm/include/这里指定freetds的头文件路径
/home/freetds-arm/lib/libsybdb.a指定freetds共享库路径
librt.so 这个是运行时库,需要从开发板拷过来,也可以从交叉编译器的安装目录下找到。(执行命令find / -name "*librt.so*" 即可找到)
libiconv.so.2 这个是libiconv的库
FLAGSD,由于本机都是装在/usr/lib下面的,所以直接使用-lrt连接librt.so,-liconv连接libiconv.so.2
最后
将编译目录的libiconv.so.2、transfer放到板子的 /tmp/sd/transfer下
将ubuntu的/tmp/sd/transfer/freetds.conf拷贝到板子/tmp/sd/transfer下
这样transfer就可以执行了
开发板远程操作SQL SERVER解决方案的更多相关文章
- [转]C#操作SQL Server数据库
转自:C#操作SQL Server数据库 1.概述 ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据库: 第二,建立SqlComman ...
- 远程操作 SQl server2008新建角色和数据库
远程操作 SQl server2008 1.windows身份登录,安全性-->登录名(右键)-->新建登录名:yc ,密码111111-->点选sql server身份验证--&g ...
- PHP操作SQL Server 2008/2012
PHP操作SQL Server驱动,微软官方提供2个版本,Version 2.0 和 Version 3.0 Version 2.0 版本支持的操作系统有: Windows Server 2003 S ...
- 使用php来访问操作sql server
使用php来访问操作sql server 在此分成三步走: 第一部:查看配置,下载文件 首先查看自己的php和sql server版本 Php文件输入echo PHP_VERSION 运行脚本就可以 ...
- Navicat 远程连接SQL Server 2014 Express 报08001错误
场景:Navicat 远程连接SQL Server 2014 Express 报08001错误,经查验防火墙端口1434,1433已经打开 过程:1. 一开始觉得是连接名称问题,使用IP地址或者主机名 ...
- SQL Server学习之路(七):Python3操作SQL Server数据库
0.目录 1.前言 2.准备工作 3.简单测试语句 4.提交与回滚 5.封装成类的写法 1.前言 前面学完了SQL Server的基本语法,接下来学习如何在程序中使用sql,毕竟不能在程序中使用的话, ...
- Nodejs 操作 Sql Server
Nodejs 操作 Sql Server Intro 最近项目需要爬取一些数据,数据有加密,前端的js又被混淆了,ajax请求被 hook 了,有些复杂,最后打算使用 puppeteer 来爬取数据. ...
- 数据库SQL Server2012笔记(七)——java 程序操作sql server
1.crud(增删改查)介绍:create/retrieve/update/delete 2.JDBC介绍 1)JDBC(java database connectivity,java数据库连接) 2 ...
- Python 学习笔记:Python 操作 SQL Server 数据库
最近要将数据写到数据库里,学习了一下如何用 Python 来操作 SQL Server 数据库. 一.连接数据库: 首先,我们要连接 SQL Server 数据库,需要安装 pymssql 这个第三方 ...
随机推荐
- myeclipse连接oracle步骤
1.加载ojdbc.jar驱动(路径:E:\myoracle\oracle\product\11.2.0\dbhome_1\jdbc\lib) 2.String url = "jdbc:or ...
- HashMap对象的深层克隆
1.java.util.HashMap 的 clone 方法是浅层copy,clone出来的对象,仅仅是原来对象的一个引用,并且对克隆出来的对象进行操作是无效的. 下面是个例子: import jav ...
- WPF界面布局——各种控件
Grid是最常用的动态布局控件,也是所有动态布局控件中唯一可按比例动态调整分配空间的控件. label : 标签,用来显示文本内容.可以为其他控件如文本框等添加一些描述性的信息. TextBox : ...
- Modbus RTU程序开发解读
Modbus是很好的串口通信协议,其中RTU协议最为常用,通过Modbus RTU,我们可以轻松读写串口信息. 从官网下载libModbus,观察modbus.h可知关键的结构体为: typedef ...
- [mobile开发碎碎念]手机页面上显示PDF文件
demo:http://mozilla.github.io/pdf.js/web/viewer.html 项目地址:https://github.com/mozilla/pdf.js <scri ...
- 解决ora-00054 Oracle锁表问题
1.运行sql: select session_id from v$locked_object; 查出锁表的session,可能很多,正常是没有的 2.SELECT sid, serial#, u ...
- TypeError: coercing to Unicode: need string or buffer, ChatRoom found
在用django框架中遇到一个错误,是模型编写中出的错误 TypeError: coercing to Unicode: need string or buffer, ChatRoom found 解 ...
- 关闭显示器API及命令
window下命令powercfg /change "Home/Office Desk" /moniter-timeout-ac 1C#中实现[DllImportAttribute ...
- 网页中多媒体对像标记<OBJECT>和<EMBED>
在网页中常用object和embed标记插入的多媒体对象,比如FLASH,视频等. 用一个快播例子说明下这两个标记的使用和区别: <object classid="clsid:F3D0 ...
- POJ 3126 Prime Path
给定两个四位素数a b,要求把a变换到b 变换的过程要保证 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位不同,而且每步得到的素数都不能 ...