需要的材料
说明
连接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 type | Null substitution value |
---|---|
TINYBIND | 0 |
SMALLBIND | 0 |
INTBIND | 0 |
CHARBIND | Empty string (padded with blanks) |
STRINGBIND | Empty string (padded with blanks, null-terminated) |
NTBSTRINGBIND | Empty string (null-terminated) |
VARYCHARBIND | Empty string |
BINARYBIND | Empty array (padded with zeros) |
VARYBINBIND | Empty array |
DATETIMEBIND | 8 bytes of zeros |
SMALLDATETIMEBIND | 8 bytes of zeros |
MONEYBIND | $0.00 |
SMALLMONEYBIND | $0.00 |
FLT8BIND | 0.0 |
REALBIND | 0.0 |
DECIMALBIND | 0.0 (with default scale and precision) |
NUMERICBIND | 0.0 (with default scale and precision) |
BOUNDARYBIND | Empty string (null-terminated) |
SENSITIVITYBIND | Empty string (null-terminated) |
dbclose和dbexit
dbclose
是关闭并释放一个指定的DBPROCESS,而
dbexit
是关闭并释放所有的DBPROCESS。
Sybase强烈建议:程序中使用
dbinit
和
dbexit
,并且在
dbexit
之后不能再调用任何DB-Library相关函数!