开发板远程操作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 这个第三方 ...
随机推荐
- 使用时间戳和sequence生成主键的function
create or replace function fn_getKeyreturn varchar2is k varchar2(30);begin select to_char(sysdate, ...
- EasyUI-validatebox 自定义validType验证
根据项目要求,对于一些信息的验证也越来越特殊,当你发现EasyUI-validatebox提供的常用的validType验证类型已经满足不了你时,你可以选择自己自定义新的validType来完成信息验 ...
- 转!!Java代码规范、格式化和checkstyle检查配置文档
为便于规范各位开发人员代码.提高代码质量,研发中心需要启动代码评审机制.为了加快代码评审的速度,减少不必要的时间,可以加入一些代码评审的静态检查工具,另外需要为研发中心配置统一的编码模板和代码格式化模 ...
- React 学习资源汇总(最全的 React 学习资料)
http://www.360doc.com/content/16/1108/10/17722897_604827790.shtml
- swift_初始化器的使用
//: Playground - noun: a place where people can play import Cocoa ***************************结构体与Cla ...
- meta 360极速模式
<meta name="render" content="webkit"> 启用360极速模式
- C#日常总结
if (!string.IsNullOrEmpty(userid)) { InitPage(); } IsNullOrEmpty 同时测试String是否为nullNothingnullptrnull ...
- IIS 常见问题集记录
win7 iis7.5 详细错误信息模块 IIS Web Core 通知 BeginRequest 处理程序 尚未确定 错误代码 0x80070021 配置错误 不能在此路径中使用此配置节.如果在父级 ...
- 转载:ViewHolder为什么声明为static
转自:http://www.cnblogs.com/bluestorm/p/5867061.html ListView优化中ViewHolder要不要定义为static静态内部类? 给学生讲课的时 ...
- cocos2d-x的CCAffineTransform相关变换实现原理
稍有opengl或3d基础的都知道平移/旋转/缩放这几个基本模型视图变换的实现原理, 最近看了下cocos2d-x相关部分的实现, 了解了这些实现那些各种坐标变换基本不在话下了, cocos2d-x本 ...