参考文档:
http://blog.csdn.net/aidenliu/article/details/6664382
http://blog.csdn.net/kunp/article/details/387013
在linux下连接MSSQL是一件很痛苦的事,因为微软没有提供任何接口给开发人员,大约他们认为要用MSSQL的,只可能是windows的操作系统。还好,MSSQL是从Sybase衍生出来的,有一些哥们做了一些Sybase的Linux下的连接库,这些连接库同时也能支持MSSQL,FreeTDS就是这样的一个东东。
一 测试windows系统sql server服务是否开启
1. ping 服务器
$ping 192.168.0.140
PING 192.168.0.140 (192.168.0.140) 56(84) bytes of data.
64 bytes from 192.168.0.140: icmp_seq=1 ttl=128 time=0.542 ms
64 bytes from 192.168.0.140: icmp_seq=2 ttl=128 time=0.540 ms
64 bytes from 192.168.0.140: icmp_seq=3 ttl=128 time=0.540 ms
ping 成功说明服务器存在。
2. telnet服务器
$ telnet 192.168.0.140 1433
Trying 192.168.0.140...
Connected to 192.168.0.140.
Escape character is '^]'.
telnet成功说明1433端口已开启了服务。
二 配置安装FreeTDS
1.下载FreeTDS
从FreeTDS官网上下载最新版的freetds-stable.tgz, 下载地址:http://www.freetds.org/software.html
2. 下载后解压到/opt/目标下
tar xvf freetds-stable.tgz /opt/
3. 配置freetds
./configure --prefix=/usr/local/freetds7.0 --with-tdsver=7.0 --enable-msdblib
强列建议--with-tdsver=7.0,安照 很多网友配置的--with-tdsver=8.0, c语言程序根本就无法实现,查看配置文件才发现是这里出错了!
查看配置文件:
./configure --help
打印信息为:
--with-tdsver=VERSION TDS protocol version (4.2/4.6/5.0/7.0/7.1) [5.0]
没有8.0选项!!
4.安装
make && make install
三 测试FreeTDS
cd /opt/freetds-0.91/src/apps/
./tsql -H 192.168.0.140 -p 1433 -U sa -P password
如果成功,则会显示:
locale is "zh_CN.utf8"
locale charset is "UTF-8"
using default charset "UTF-8"
1>
输入:
1> select @@version
2> go
显示:
Microsoft SQL Server 2005 - 9.00.1399.06 (X64)
Oct 14 2005 00:35:21
Copyright (c) 1988-2005 Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)
到此, FreeTDS安装完毕!
四 c程序实现与sql server数据库连接
在网上找了一段程序,做了部分修改,现把实现过程记录如下(参考http://os.chinaunix.net/a2008/1031/989/000000989437.shtml)
1. 源程序(testsybase.c):
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sybfront.h>
#include<sybdb.h>
int main(void)
{
char szUsername[32]= "sa";
char szPassword[32]= "password";
char szDBName[32]= "users";
char szServer[32]= "192.168.0.140:1433";
//初始化db-library
dbinit();
//连接数据库
LOGINREC *loginrec=dblogin();
DBSETLUSER(loginrec,szUsername);
DBSETLPWD(loginrec,szPassword);
DBPROCESS *dbprocess=dbopen(loginrec,szServer);
if(dbprocess==FAIL){
printf("ASB>>ConectMSSQLSERVERfail\n");
return 0;
}else{
printf("ASB>>ConnectEMSconectMSSQLSERVERsuccess\n");
}
if(dbuse(dbprocess,szDBName)==FAIL){
printf("ASB>>Opendatabasenamefail\n");
}else{
printf("ASB>>Opendatabasenamesuccessn\n");
}
//查询数据库
dbcmd(dbprocess,"select * from user");
if(dbsqlexec(dbprocess)==FAIL){
printf("ASB>>QueryAlarmstableerror\n");
}
else
printf("ASB>>QueryAlarmstable success\n");
DBINT result_code;
char szID[1024];
char szBeginTime[1024];
char szDescription[1024];
int rows=0;
while((result_code=dbresults(dbprocess))!=NO_MORE_RESULTS)
{
if(result_code==SUCCEED){
dbbind(dbprocess,1,CHARBIND,(DBINT)0,(BYTE*)szID);
dbbind(dbprocess,2,CHARBIND,(DBCHAR)0,(BYTE*)szBeginTime);
dbbind(dbprocess,3,CHARBIND,(DBCHAR)0,(BYTE*)szDescription);
while(dbnextrow(dbprocess)!=NO_MORE_ROWS){
printf("ASB>>ID=%s\n",szID);
printf("ASB>>szAid=%s\n",szBeginTime);
printf("ASB>>szBeginTime=%s\n",szDescription);
}
}
}
//关闭数据库连接
dbclose(dbprocess);
return 0;
2. 编译:
gcc -o testsybase testsybase.c -L /usr/local/freetds7.0/lib/ -lsybdb -I /usr/local/freetds7.0/include/
3. 执行
export LD_LIBRARY_PATH=/usr/local/freetds7.0/lib/
./testsybase
结果为:
ASB>>ConnectEMSconectMSSQLSERVERsuccess
ASB>>Opendatabasenamesuccessn
ASB>>ID=1]�U�Y�z�-�Y���[�
ASB>>szAid=zzh�
ASB>>szBeginTime=
ASB>>ID=2]�U�Y�z�-�Y���[�
ASB>>szAid=yyq�
ASB>>szBeginTime=
ASB>>ID=3]�U�Y�z�-�Y���[�
ASB>>szAid=tcc�
ASB>>szBeginTime=
ASB>>ID=4]�U�Y�z�-�Y���[�
ASB>>szAid=admin
ASB>>szBeginTime=
中文显示乱码,因为windows系统编码格式为GBK, linux系统为utf8,导致中文显示为乱码,需要进行转码。
utf8转gbk可以使用iconv进行转码(可参考:http://blog.sina.com.cn/s/blog_69b6a7c601012ywh.html)
gbk 转utf8 可参考: http://blog.csdn.net/lvhongya/article/details/7011019