linux下连接MSSQL

需要的材料

说明

连接MSSQL为什么要涉及这两个东西呢,原来MSSQL和sybase这两个数据库的通讯架构是类似的,是服务器/客户端模式;而freeTDS是一款开源的用来实现TDS(Tabular Data Stream)通讯的软件,它实现了一些基本的访问数据库的接口(参照MSSQL和sybase),所以在linux下,我们可以通过freeTDS提供的接口来实现对MSSQL的访问,而sybase在这里的作用就是给我们提供参考,即如何调用这些函数去访问数据库。

我使用的环境是virtualbox的Ubuntu14.04的虚拟机,网路是通过桥接的方式连接到笔记本的无线网卡上,Ubuntu系统的网络配置是通过修改/etc/network/interfaces文件,指定静态ip的方式来设定的:
在这里插入图片描述

freeTDS

freeTDS源码获取

https://github.com/FreeTDS/freetds,通过git或浏览器直接下载。

freeTDS编译、安装

(推荐)参考官方说明https://github.com/FreeTDS/freetds/blob/master/INSTALL.GIT.md,或网上找教程
执行./autogen.sh过程中可能会报错,缺少某个程序,在线或离线安装下再重新运行autogen.sh即可,否则生成不了makefile文件,无法make编译!

freeTDS测试

假设freeTDS的安装目录为:/usr/local/freetds/,则以下目录分别为:

  • /usr/local/freetds/bin/:一些工具(测试功能时会用到)
  • /usr/local/freetds/etc/:配置文件(运行工具可能会用到)
  • /usr/local/freetds/include/:头文件(编写用户程序会用到)
  • /usr/local/freetds/lib/:库文件(编写用户程序会用到)
    我们切换到/usr/local/freetds/bin/目录下,可以看到有好几个可执行文件:
    在这里插入图片描述
    我们这里测试只用到tsql,首先确保Ubuntu能ping通数据库电脑(我是用自己电脑上的数据库测试的),接下来我们执行:

    如果是这样子,说明我们没有指定数据库的端口,软件也没能自动扫描到,所以这时候需要我们通过(小p)-p port手动指定下。
    在这里插入图片描述
    这样子说明我们成功连接到数据库了,进入了交互界面,其他错误,可以自己尝试下。接下来我们测试sql语句查询:
    在这里插入图片描述
    好啦,至此,说明freetds是可以正常使用了,具体的使用说明去看资料吧。

freeTDS库使用

参考官网的UserGuide,上面有example

sybase网站

但是官网这里对每个函数的形参和返回值的说明不是很清晰,所以这时候我们就需要参考sybase网站的函数说明啦:
在这里插入图片描述
在这里插入图片描述
很详细有木有,所以说freeTDS是提供了一套可以在(包括但不限于)linux下访问(包括但不限于)MSSQL、SYBASE数据库的接口,而这些接口的命名不是独立的,而是“兼容”数据库官网接口的,这样我们就只要对照着官方的教程就也可以一步一步的实现同样功能啦,而SYBASE网站则是我们的参考。

目前已经实现的函数可以到这里查看。
在这里插入图片描述

函数记录

可以先通过这个帖子大概看一下,具体的最好还是对照官网原文看。

dbbind

RETCODE dbbind(dbproc, column, vartype, varlen, 
             varaddr)
 /*句柄*/
 DBPROCESS     *dbproc;
 /*绑定第几列数据,从1开始*/
 int                       column;
 /*服务器(对应列的字段的)数据类型,如char、varchar、int等,
 可以通过xxxBIND中的xxx了解该使用哪个,如CHARBIND对应char,VARCHARBIND对应varchar,
 INTBIND对应int*/
 int                       vartype;
 /*The length of the program variable in bytes.
 For values of vartype that represent a fixed-length type, 
 such as MONEYBIND or FLT8BIND, this length is ignored.
 指明程序中变量的长度,对于可变长度类型,length是被忽略的,如MONEYBIND和FLT8BIND,
 如果varlen为0,这一列数据的总长度将被全部复制到程序变量中(对于char和binary,总长度是服务器上定义的对应列大小;对于varchar、varbinary、text、和image data,总长度是当前列的实际数据长度),因此,将varlen设为0时,你得确保你的程序变量有足够大的空间能确保所有数据都能被放得下!*/
 DBINT                varlen;
 /*程序中用来存放绑定结果的变量地址,其中BYTE是unsigned char的重定义*/
 BYTE                 *varaddr; 

  • 服务器类型nchar和nvarchar在内部转换为char和varchar类型,它们对应于DB-Library类型常量SYBCHAR。
  • 在这里插入图片描述
    字符和文本数据的可用表示如下所示。根据数据是空白填充还是以空字符结尾,它们有所不同。请注意,如果varlen为0,则不会进行填充,并且“ \ 0”是空终止符:

  • 如果在将整数或浮点数据转换为字符/文本绑定类型时发生溢出,则结果值的第一个字符将包含一个星号(“ *”)用来表示错误。

在这里插入图片描述
某些情况下,DB-Library会给出一个信息来表明数据结果转换发生了溢出,这可能就是指定的varlen对于服务器数据来说太小了!

  • 在这里插入图片描述
    一个列只能绑定到一个程序变量上,否则只有最后绑定的那个程序变量会起作用。

dbsetnull

设置对于服务器返回的null的定义。

RETCODE dbsetnull(dbproc, bindtype, bindlen, bindval)
 
 DBPROCESS     *dbproc;
 int                        bindtype;
 int                        bindlen;
 BYTE                *bindval;

对于不同服务器数据类型,对应的null的替代值

Binding typeNull substitution value
TINYBIND0
SMALLBIND0
INTBIND0
CHARBINDEmpty string (padded with blanks)
STRINGBINDEmpty string (padded with blanks, null-terminated)
NTBSTRINGBINDEmpty string (null-terminated)
VARYCHARBINDEmpty string
BINARYBINDEmpty array (padded with zeros)
VARYBINBINDEmpty array
DATETIMEBIND8 bytes of zeros
SMALLDATETIMEBIND8 bytes of zeros
MONEYBIND$0.00
SMALLMONEYBIND$0.00
FLT8BIND0.0
REALBIND0.0
DECIMALBIND0.0 (with default scale and precision)
NUMERICBIND0.0 (with default scale and precision)
BOUNDARYBINDEmpty string (null-terminated)
SENSITIVITYBINDEmpty string (null-terminated)

dbclose和dbexit

dbclose是关闭并释放一个指定的DBPROCESS,而dbexit是关闭并释放所有的DBPROCESS。
Sybase强烈建议:程序中使用dbinitdbexit,并且在dbexit之后不能再调用任何DB-Library相关函数!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值