Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码)

转载 2012年10月17日 15:55:59

http://blog.csdn.net/zhangm168/article/details/6859112

Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码)


(1)安装freeTDS

FreeTDS为Linux系统提供了TDS协议的开源客户端。由于MS SQL和Sybase使用的恰是TDS协议,所以在Linux中可以用FreeTDS连接MS SQL。

官网:http://www.freetds.org

下载:wget http://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz

安装:
[root@vm01 ~]# tar -zxvf freetds-stable.tgz
[root@vm01 ~]# cd freetds-0.91
[root@vm01 freetds-0.91]# ./configure --prefix=/usr/local/freetds --with-tdsver=8.0 --enable-msdblib
[root@vm01 freetds-0.91]# make
[root@vm01 freetds-0.91]# make install

修改环境变量:
FREETDS_HOME=/usr/local/freetds
export PATH=$FREETDS_HOME/bin:$PATH

库文件加载:
[root@vm01 freetds-0.91]# vim /etc/ld.so.conf.d/freetds.conf
/usr/local/freetds/lib
[root@vm01 freetds-0.91]# ldconfig

(2) 修改配置文件,连接数据库
(i) 添加数据源
[root@vm01 test]# vim /usr/local/freetds/etc/freetds.conf 
#zkl add
[SQL2005]
        host = 192.168.232.133
        port = 1433
        tds version=8.0
#client charset = ISO-8859-1
完成后,使用如下命令即可连接到 SQL Server 2005 .
[root@vm01 test]# tsql -S SQL2005 -U sa -P zkl
locale is "zh_CN.GB18030"
locale charset is "GB18030"
using default charset "GB18030"
1> use test  [使用test数据库]
2> go
1> select * from StuInfo [查询表信息]
2> go
StuID Name   Age
001 zyh   24
002 zkl   21
003 Jim   24
(3 rows affected)

(ii) 修改协议版本以正常连接SQL Server 2005
修改 freetds 配置文件
[root@vm01 test]# vim /usr/local/freetds/etc/freetds.conf 
[global]
        # TDS protocol version
#;      tds version = 4.2

         tds version=8.0   (这个前面不能有逗号)

连接 SQL SERVER 2005 需要使用的协议版本为 8.0,而使用 4.2 时,连接将会失败。使用 tsql 命令连接时,如果不像步骤(2)中那样配置数据源,则同样需要修改协议,然后才能使用如下命令正常连接数据库:
[root@vm01 test]# tsql -H 192.168.232.133 -p 1433 -U sa -P zkl

注意:第一个p为小写,后面的P是大写。

(3) 使用C++代码连接数据库
首先,确保协议版本是 8.0,然后编译以下C代码,测试与数据库的连接。

test.c:
-----------------------------------------------
  1. #include <stdio.h> 
  2. #include <string.h> 
  3. #include <stdlib.h> 
  4. #include <unistd.h>  
  5.   
  6. #include <sybfront.h> //freetds头文件 
  7. #include <sybdb.h> //freetds 
  8.   
  9.   
  10. int main(void
  11.     char szUsername[32] = "sa"
  12.     char szPassword[32] = "zkl"
  13.     char szDBName[32] = "test"//数据库名 
  14.     char szServer[32] = "192.168.232.133:1433";//数据库服务器:端口 
  15.   
  16.     //初始化db-library 
  17.     dbinit(); 
  18.         
  19.     //连接数据库 
  20.     LOGINREC *loginrec = dblogin(); 
  21.     DBSETLUSER(loginrec, szUsername);        
  22.     DBSETLPWD(loginrec, szPassword); 
  23.     DBPROCESS *dbprocess = dbopen(loginrec, szServer);//连接数据库 
  24.     if(dbprocess == FAIL) 
  25.     { 
  26.         printf("Conect to MS SQL SERVER fail, exit!\n"); 
  27.         return -1;  
  28.     } 
  29.     printf("Connect to MS SQL SERVER success!\n"); 
  30.         
  31.     if(dbuse(dbprocess, szDBName) == FAIL) 
  32.         printf("Open database failed!\n"); 
  33.     else 
  34.         printf("Open database success!\n"); 
  35.         
  36.     //查询数据库 
  37.     printf("[查询数据库表]\n"); 
  38.     dbcmd(dbprocess, "select StuID, Name, Age from StuInfo"); 
  39.     if(dbsqlexec(dbprocess) == FAIL) 
  40.     { 
  41.         printf("Query table 'StuInfo' error.\n"); 
  42.         return -1;  
  43.     } 
  44.       
  45.     DBINT result_code; 
  46.     char szStuID[20]={}; 
  47.     char szName[80]={}; 
  48.     char szAge[10]={}; 
  49.     int rows = 0; 
  50.     while ((result_code = dbresults(dbprocess)) != NO_MORE_RESULTS){ 
  51.         if (result_code == SUCCEED){ 
  52.             dbbind(dbprocess, 1, CHARBIND, (DBINT)0, (BYTE*)szStuID); 
  53.             dbbind(dbprocess, 2, CHARBIND, (DBCHAR)0, (BYTE*)szName); 
  54.             dbbind(dbprocess, 3, CHARBIND, (DBCHAR)0, (BYTE*)szAge); 
  55.             printf("StuID\tName\tAge\n", szStuID); 
  56.             while (dbnextrow(dbprocess) != NO_MORE_ROWS){                         
  57.                 printf("%s\t", szStuID); 
  58.                 printf("%s\t", szName); 
  59.                 printf("%s\n", szAge); 
  60.             } 
  61.         } 
  62.     }        
  63.   
  64.     printf("[插入数据到数据库表]\n"); 
  65.     dbcmd(dbprocess, "insert into StuInfo(StuID, Name, Age) values(888,'James',28)"); 
  66.     if(dbsqlexec(dbprocess) == FAIL) 
  67.     { 
  68.         printf("insert into table 'StuInfo' error.\n"); 
  69.         return -1;  
  70.     } 
  71.     printf("insert into table 'StuInfo' success.\n"); 
  72.      
  73.     printf("[删除数据库表中的记录]\n"); 
  74.     dbcmd(dbprocess, "delete from StuInfo where StuID=888"); 
  75.     if(dbsqlexec(dbprocess) == FAIL) 
  76.     { 
  77.         printf("delete from table 'StuInfo' error.\n"); 
  78.         return -1;  
  79.     } 
  80.     printf("delete from table 'StuInfo' success.\n"); 
  81.      
  82.     //关闭数据库连接 
  83.     dbclose(dbprocess); 
  84.  
  85.     return 0; 
  86. }  
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <stdlib.h>  
  4. #include <unistd.h>   
  5.    
  6. #include <sybfront.h> //freetds头文件  
  7. #include <sybdb.h> //freetds  
  8.    
  9.    
  10. int main(void)  
  11. {  
  12.     char szUsername[32] = "sa";  
  13.     char szPassword[32] = "zkl";  
  14.     char szDBName[32] = "test"//数据库名  
  15.     char szServer[32] = "192.168.232.133:1433";//数据库服务器:端口  
  16.    
  17.     //初始化db-library  
  18.     dbinit();  
  19.          
  20.     //连接数据库  
  21.     LOGINREC *loginrec = dblogin();  
  22.     DBSETLUSER(loginrec, szUsername);         
  23.     DBSETLPWD(loginrec, szPassword);  
  24.     DBPROCESS *dbprocess = dbopen(loginrec, szServer);//连接数据库  
  25.     if(dbprocess == FAIL)  
  26.     {  
  27.         printf("Conect to MS SQL SERVER fail, exit!\n");  
  28.         return -1;   
  29.     }  
  30.     printf("Connect to MS SQL SERVER success!\n");  
  31.          
  32.     if(dbuse(dbprocess, szDBName) == FAIL)  
  33.         printf("Open database failed!\n");  
  34.     else  
  35.         printf("Open database success!\n");  
  36.          
  37.     //查询数据库  
  38.     printf("[查询数据库表]\n");  
  39.     dbcmd(dbprocess, "select StuID, Name, Age from StuInfo");  
  40.     if(dbsqlexec(dbprocess) == FAIL)  
  41.     {  
  42.         printf("Query table 'StuInfo' error.\n");  
  43.         return -1;   
  44.     }  
  45.        
  46.     DBINT result_code;  
  47.     char szStuID[20]={};  
  48.     char szName[80]={};  
  49.     char szAge[10]={};  
  50.     int rows = 0;  
  51.     while ((result_code = dbresults(dbprocess)) != NO_MORE_RESULTS){  
  52.         if (result_code == SUCCEED){  
  53.             dbbind(dbprocess, 1, CHARBIND, (DBINT)0, (BYTE*)szStuID);  
  54.             dbbind(dbprocess, 2, CHARBIND, (DBCHAR)0, (BYTE*)szName);  
  55.             dbbind(dbprocess, 3, CHARBIND, (DBCHAR)0, (BYTE*)szAge);  
  56.             printf("StuID\tName\tAge\n", szStuID);  
  57.             while (dbnextrow(dbprocess) != NO_MORE_ROWS){                          
  58.                 printf("%s\t", szStuID);  
  59.                 printf("%s\t", szName);  
  60.                 printf("%s\n", szAge);  
  61.             }  
  62.         }  
  63.     }         
  64.    
  65.     printf("[插入数据到数据库表]\n");  
  66.     dbcmd(dbprocess, "insert into StuInfo(StuID, Name, Age) values(888,'James',28)");  
  67.     if(dbsqlexec(dbprocess) == FAIL)  
  68.     {  
  69.         printf("insert into table 'StuInfo' error.\n");  
  70.         return -1;   
  71.     }  
  72.     printf("insert into table 'StuInfo' success.\n");  
  73.       
  74.     printf("[删除数据库表中的记录]\n");  
  75.     dbcmd(dbprocess, "delete from StuInfo where StuID=888");  
  76.     if(dbsqlexec(dbprocess) == FAIL)  
  77.     {  
  78.         printf("delete from table 'StuInfo' error.\n");  
  79.         return -1;   
  80.     }  
  81.     printf("delete from table 'StuInfo' success.\n");  
  82.       
  83.     //关闭数据库连接  
  84.     dbclose(dbprocess);  
  85.   
  86.     return 0;  
  87. }   


-----------------------------------------------

Makefile:
-----------------------------------------------
default:
gcc test.c -o test -L/usr/local/freetds/lib -lsybdb -I/usr/local/freetds/include
-----------------------------------------------

在Ubuntu 10.04中文版下Qt编程,使用unixODBC和FreeTDS连接MS SQL Server 2005,并且中文不出现乱码的方法

装载于: http://blog.renren.com/share/235081772/4016936282 回头来看,还是很简单的,但是由于自身对linux使用方面的不熟练,以及网上资料的...
  • w_ww_w
  • w_ww_w
  • 2014年01月10日 10:09
  • 2254

Linux平台使用Freetds连接SQL Server服务器,兼容PHP和Laravel

Linux平台 PHP和Laravel连接SQL Server
  • skykingf
  • skykingf
  • 2015年03月24日 17:27
  • 5874

Linux环境PHP5.5以上连接SqlServer2008【全网最经典无错版】

linux版本:64位CentOS 6.4Nginx版本:nginx1.8.0php版本:php5.5.28Sqlserver:2008 关于Linux环境安装Nginx+PHP参考《Linux环境N...
  • 21aspnet
  • 21aspnet
  • 2015年08月12日 21:06
  • 15987

Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码)

http://blog.csdn.net/zhangm168/article/details/6859112 Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C...
  • helonSY
  • helonSY
  • 2012年01月17日 16:52
  • 10535

Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码)

Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码) (1)安装freeTDS FreeTDS为Linux系统提供了TDS协议的开源客户端。由于MS ...
  • zhangm168
  • zhangm168
  • 2011年10月10日 14:36
  • 5638

Linux下使用FreeTDS访问MS SQL Server 2005数据库(C测试源码)

  • 2017年08月22日 11:03
  • 3KB
  • 下载

在Ubuntu 10.04中文版下Qt编程,使用unixODBC和FreeTDS连接MS SQL Server 2005,并且中文不出现乱码的方法

在Ubuntu 10.04中文版下Qt编程,使用unixODBC和FreeTDS连接MS SQL Server 2005,并且中文不出现乱码的方法 作者 :  汪灏 回头来看,还是很简单的,但是由...
  • sdwfkfq
  • sdwfkfq
  • 2016年03月29日 19:19
  • 268

在linux上配置unixODBC和FreeTDS访问MS SQL Server.

一, 安装 unixODBC 下载安装包. 在 RedHat 安装光盘上就有 unixODBC-2.2.11-1.RHEL4.1.i386.rpm unixODBC-devel-2.2.11...
  • wangjunhe
  • wangjunhe
  • 2011年05月23日 09:47
  • 1365

MS SQL Server 2005数据库可疑、置疑修复方法

MS SQL Server 2005数据库可疑、置疑修复方法  [复制链接] 发表于 2013-7-13 12:45 | 来自  51CTO网页 [只看他] 楼主 ...
  • tuxingzhou
  • tuxingzhou
  • 2015年11月23日 12:22
  • 300

ms sql server 2005数据库日志文件过大,需要清除或者清空

数据库:ms sql server 2005 任务:ms sql server 2005数据库日志文件过大,需要清除。 方法: backup log [你的数据库名称] WITH N...
  • joyhpo
  • joyhpo
  • 2012年09月12日 15:48
  • 277
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码)
举报原因:
原因补充:

(最多只允许输入30个字)