环境:

开发板: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解决方案的更多相关文章

  1. [转]C#操作SQL Server数据库

    转自:C#操作SQL Server数据库 1.概述 ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据库: 第二,建立SqlComman ...

  2. 远程操作 SQl server2008新建角色和数据库

    远程操作 SQl server2008 1.windows身份登录,安全性-->登录名(右键)-->新建登录名:yc ,密码111111-->点选sql server身份验证--&g ...

  3. PHP操作SQL Server 2008/2012

    PHP操作SQL Server驱动,微软官方提供2个版本,Version 2.0 和 Version 3.0 Version 2.0 版本支持的操作系统有: Windows Server 2003 S ...

  4. 使用php来访问操作sql server

    使用php来访问操作sql server 在此分成三步走: 第一部:查看配置,下载文件 首先查看自己的php和sql server版本 Php文件输入echo PHP_VERSION  运行脚本就可以 ...

  5. Navicat 远程连接SQL Server 2014 Express 报08001错误

    场景:Navicat 远程连接SQL Server 2014 Express 报08001错误,经查验防火墙端口1434,1433已经打开 过程:1. 一开始觉得是连接名称问题,使用IP地址或者主机名 ...

  6. SQL Server学习之路(七):Python3操作SQL Server数据库

    0.目录 1.前言 2.准备工作 3.简单测试语句 4.提交与回滚 5.封装成类的写法 1.前言 前面学完了SQL Server的基本语法,接下来学习如何在程序中使用sql,毕竟不能在程序中使用的话, ...

  7. Nodejs 操作 Sql Server

    Nodejs 操作 Sql Server Intro 最近项目需要爬取一些数据,数据有加密,前端的js又被混淆了,ajax请求被 hook 了,有些复杂,最后打算使用 puppeteer 来爬取数据. ...

  8. 数据库SQL Server2012笔记(七)——java 程序操作sql server

    1.crud(增删改查)介绍:create/retrieve/update/delete 2.JDBC介绍 1)JDBC(java database connectivity,java数据库连接) 2 ...

  9. Python 学习笔记:Python 操作 SQL Server 数据库

    最近要将数据写到数据库里,学习了一下如何用 Python 来操作 SQL Server 数据库. 一.连接数据库: 首先,我们要连接 SQL Server 数据库,需要安装 pymssql 这个第三方 ...

随机推荐

  1. virsh创建和恢复快照

    virsh创建快照: virsh snapshot-create-as image的名称 snapshot的名称 例如: virsh snapshot-create-as 172.16.1.1_cen ...

  2. hibernate 和 myBatis 比较

    Hibernate与 MyBatis的比较 第一章     Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jbos ...

  3. 搭建ubuntu14.04的hadoop集群【docker容器充当服务器】

    首先弄出来装有hadoop.java.ssh.vim的镜像起名badboyf/hadoop.做镜像有两种方法,一种是用Dockerfile来生成一个镜像,一种是基于ubuntu14.04的基础镜像生成 ...

  4. ActiveReports最终报表设计器本地化方法介绍

    ActiveReports UI界面中的所有字符信息.错误提示信息.以及一些logo.图像资源,都能够通过运行batch文件来本地化.本文主要介绍资源本地化的具体步骤: 1. 资源目录 所有可本地化的 ...

  5. java怎么定义一个二维数组?

    java中使用 [][] 来定义二维数组 定义数组时也可同时初始化下面是一些例子float[][] numthree; //定义一个float类型的2维数组numthree=new float[5][ ...

  6. java list 简述

    list中可以添加任何对象,我可以给你举个例子:class Person{ .....}上面定义了一个Person类,下面看好如何使用ListPerson p1=new Person();Person ...

  7. Unity3D 中的3种坐标系

    Unity3D Script API : Camera 若干文章: 1.Screen VS Viewport What is the difference 2.Screen,Viewport有什麽區別 ...

  8. Sql Server 删除所有表(转)

    http://www.cnblogs.com/jys509/p/3589468.html  首先必须要清空所有表的外键 DECLARE c1 cursor for select 'alter tabl ...

  9. FlexBox标准及兼容写法速查表

    FlexBox标准写法: 支持浏览器: IE11,  Chrome29+, FireFox 20+, Safari加前缀 -webkit- 概述: 总的来说就是12个属性; 关于容器的6个,5个单一属 ...

  10. Windows Store App JavaScript 开发:页面加载

      在开发基于JavaScript的Windows应用商店应用时,可以使用HtmlControl和PageControl控件加载一个页面,这两个WinJS库控件曾在上面的内容中提到过,HtmlCont ...