linux平台下通过FreeTDS实现sql server数据库连接(通过测试)

参考文档:

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





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值