什么是FreeTDS
  简单的说FreeTDS是一个程序库,可以实现在Linux系统下访问微软的SQL数据库! FreeTDS 是一个开源(如果你喜欢可以称为自由)的程序库,是TDS(表列数据流 )协议的再次实现。它可以被用在Sybase的db-lib或者ct-lib库。它也包含一个ODBC的库。允许许多开源的应用软件比如Perl和PHP(或者你自己的c或C++程序)去连接到Sybase或 Microsoft SQL服务器。FreeTDS 以源码的形式被发布,几乎可以在任何操作系统上编译。意味着Unix和类Unix系统(包括著名的分支如Interix和QNX),还有Win32,VMS,和OSX。

FreeTDS的安装
1.下载freetds,点此下载 http://www.jb51.net/database/201983.html

2.将其解压到任意目录,进入到解压后的文件夹里。

3.切换到root,配置: ./configure –prefix=/usr/local –with-tdsver=7.1 –enable-msdblib 解释:–prefix为设置FreeTDS的安装目录,–with-tdsver是设置TDS版本, –enable-msdblib为是否允许Microsoft数据库函数库

4.make & make install

FreeTDS测试:
FreeTDS安装好了,接下来就可以查看下FreeTDS状态了;

运行./tsql  -C ,在安装目录的bin目录下可以找到tsql ,查看终端打印出来信息,这个-with-tdsver=7.1:

关于安装参考
http://linux.chinaunix.net/techdoc/database/2008/10/31/1042291.shtml 或者:http://www.linuxdiyf.com/viewarticle.php?id=109086

 FreeTDS的配置
  freeTDS 的配置文件,FreeTDS也支持一个旧的配置文件interfaces,但请使用freetds.conf 除非你的环境必须使用interfaces。FreeTDS首先找freetds.conf文件如果没有找到才去找 interfaces文件。 freetds.conf文件默认在/usr/local/freetds/etc目录下,但是可以在configure时配置 sysconfdir选项,这个选项就是freetds.conf文件所存在的目录。freetds.conf配置文件分为两部分:一是[global]部分,另外一个是[dataserver]部分,其中 [dataserver]对应一个数据库。在golbal中的设置是对全部数据库起作用的,但在dataserver 部分的设置只对自己的数据库起作用,并且可以覆盖全局的设置。

例如: freetds.conf文件:

  1. [global]
  2. tds version = 4.2
  3. [myserver]
  4. host = ntbox.mydomain.com
  5. port =
  6. [myserver2]
  7. host = unixbox.mydomain.com
  8. port =
  9. tds version = 5.0

  这个文件中global设置所有数据库使用tds版本为4.2,但在myserver2中使用的版本却是5.0, 如果myserver2中没有这一项,那就是用4.2版本的如myserver。

其配置项解释如下:

  1. ltds version : 指明tds协议的版本,连接数据库时使用,如果在环境变量中没有设置 此项,则由此配置决定,协议版本可取4.,5.0,7.0,8.0
  2.  
  3. lhost : 数据库服务器的主机名或者ip地址。
  4.  
  5. lport : 数据库服务器的监听端口,可以取任何有效的端口值,一般而言Sybase SQL10以前为 10以上用5000,而Sybase SQLAnywhere 72638Microsoft SQL server则用 。此配置可以被环境变量中的TDSPORT改写。
  6.  
  7. linitial block size : 此值只能取512的倍数,默认为512,指定了协议块的最大值, 一般不要改变此默认 配置。
  8.  
  9. ldump file : 任何有效的文件名,指明了转储文件的路径并且会打开日志记录。
  10.  
  11. ldump file append: yes或者no,决定是否追加保存到dump file文件中。
  12.  
  13. ltimeout :设置处理的最大等待时间。
  14.  
  15. lconnect timeout 设置连接的最大等待时间。
  16.  
  17. lemulate little endian: yes或者no,是否强制大端机使用小端方式与MS Server通信。
  18.  
  19. lclient charset : 任何有效的iconv字符集。默认值为ISO--,使FreeTDS使用 iconv在数据库服务器和用户程序之间转换。

FreeTDS函数

  1. Dbcmddbfcmd
  2.  
  3. 函数原形: Dbcmd(DBPROCESS *proc,char * sql);
  4.  
  5.      Dbcmd(DBPROCESS *proc, char * format,char *args);
  6.  
  7. 能:该函数主要是构造sql语句,一个是带参数的,一个不带参数。
  8.  
  9. Dbsqlexec
  10.  
  11. 函数原形:DbsqlexecDBPROCESS *proc);
  12.  
  13. 能:该函数负责执行你所构造的sql语句。
  14.  
  15. Dbresults
  16.  
  17. 函数原形:DbrerultsDBPROCESS *proc);
  18.  
  19. 能:得到sql语句的执行结果。返回值如果为NO_MORE_RESULTS=,表明sql查询为空值(就是没有一条满足条件的结果),如果为(FAIL)=-,表明查询出错,如果为(SUCCESS)=,表明有结果且不为空。
  20.  
  21. DBROWS(全大写)
  22.  
  23. 函数原形:DBROWSDBPROCESS *proc);
  24.  
  25. 能:取出一行记录的信息。
  26.  
  27. Dbbind
  28.  
  29. 函数原形:DbbindDBPROCESS *procint colmn
  30.  
  31. 能:将sql查询出来的结果绑定到一个变量。第一个参数为从数据库那里拿的句柄,第二个参数是对应你的select语句中查询需要的字段(注:必须是按照select顺序绑定的,例如select userpassword from hist1 ,如果值为1,就是绑定的user),第三个参数是绑定字段的类型,最后一个参数是绑定的变量。
  32.  
  33. Dbnextrow
  34.  
  35. 函数原形:DbnextrowDBPROCESS *proc);
  36.  
  37. 能:该函数将取出满足sql语句的每一行,返回值为0,代表处理结束,返回值为-1出错。
  38.  
  39. Dbcancel
  40.  
  41. 函数原形:DbcancelDBPROCESS *proc);
  42.  
  43. 能:清空上次查询得到的数据集,如果是一个句柄的话,每次重新执行select语句之前都要调用它清空结果,不然数据库会报错的。
  44.  
  45. Dbclose
  46.  
  47. 函数原形:DbcloseDBPROCESS *proc);
  48.  
  49. 能:关闭句柄。当不再使用时必须关闭句柄。
  50.  
  51. Dbinit
  52.  
  53. 函数原形:Dbinit()
  54.  
  55. 能:初识化数据库连接。返回值为-1出错。
  56.  
  57. Dblogin
  58.  
  59. 函数原形:LOGINREC *Dblogin();
  60.  
  61. DBSETLUSER(login,SOFT); //set the database user
  62.  
  63. DBSETLPWD(login,SOFTPASS);//set password
  64.  
  65. 能:根据用户名和密码连接数据库。
  66.  
  67. Dbcount
  68.  
  69. 函数原形:DbcountDBPROCESS *proc);
  70.  
  71. 能:该函数将得到sql结果集被处理的行数,可以用它来判断你的select语句是否得到正确的处理。
  72.  
  73. Dbopen
  74.  
  75. 函数原形:DBPROCESS * DbopenLOGINREC *loginNULL);
  76.  
  77. 能:返回一个操作数据库的句柄。
  78.  
  79. 另外再介绍两个关于数据库的出错信息的函数:
  80.  
  81. dberrhandle(int *err);
  82.  
  83. dbmsghandle(int* err);

实例代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sqlfront.h> /* sqlfront.h always comes first */
  6. #include <sybdb.h> /* sybdb.h is the only other file you need */
  7. #define SQLDBIP " " //SQL数据库服务器IP
  8. #define SQLDBPORT " " //SQL数据库服务器端口
  9. #define SQLDBNAME " " //SQL数据库服务器数据库名
  10. #define SQLDBUSER " " //SQL数据库服务器数据库用户名
  11. #define SQLDBPASSWD " " //SQL数据库服务器用户密码
  12. #define SQLDBSERVER SQLDBIP":"SQLDBPORT
  13. #define DBSQLCMD "select * from yancao"
  14. int main(int argc, char *argv[])
  15. {
  16. int i, ch;
  17. LOGINREC *login; //描述客户端的结构体,在连接时被传递到服务器.
  18. DBPROCESS *dbproc; //描述连接的结构体,被dbopen()函数返回
  19. RETCODE erc; //库函数中最普遍的返回类型.
  20. /*************************************************************/
  21. //在开始调用本库函数前常常要先调用dbinit()函数
  22. if (dbinit() == FAIL) {
  23. fprintf(stderr, "%s:%d: dbinit() failed\n", argv[], __LINE__);
  24. exit();
  25. }
  26. //dblogin()函数申请 LOGINREC 结构体,此结构体被传递给dbopen()函数,用来创建一个连接。
  27. //虽然基本上不会调用失败,但是检查它!.
  28. if ((login = dblogin()) == NULL) {
  29. fprintf(stderr, "%s:%d: unable to allocate login structure\n", argv[], __LINE__);
  30. exit();
  31. }
  32. //LOGINREC结构体不能被直接访问,要通过以下宏设置,下面设置两个必不可少的域
  33. DBSETLUSER(login, SQLDBUSER);
  34. DBSETLPWD(login, SQLDBPASSWD);
  35. /*************************************************************/
  36. //dbopen()与服务器建立一个连接. 传递 LOGINREC 指针和服务器名字
  37. if ((dbproc = dbopen(login, SQLDBSERVER)) == NULL) {
  38. fprintf(stderr, "%s:%d: unable to connect to %s as %s\n",
  39. argv[], __LINE__,
  40. SQLDBSERVER, SQLDBUSER);
  41. exit();
  42. }
  43. // 可以调用dbuser()函数选择我们使用的数据库名,可以省略,省略后使用用户默认数据库.
  44. if (SQLDBNAME && (erc = dbuse(dbproc, SQLDBNAME)) == FAIL) {
  45. fprintf(stderr, "%s:%d: unable to use to database %s\n",
  46. argv[], __LINE__, SQLDBNAME);
  47. exit();
  48. }
  49. /*************************************************************/
  50. dbcmd(dbproc, DBSQLCMD);//将SQL语句填充到命令缓冲区
  51. printf("\n");
  52. if ((erc = dbsqlexec(dbproc)) == FAIL) {
  53. fprintf(stderr, "%s:%d: dbsqlexec() failed\n", argv[], __LINE__);
  54. exit(); //等待服务器执行SQL语句,等待时间取决于查询的复杂度。
  55. }
  56. /*************************************************************/
  57. //在调用dbsqlexec()、dbsqlok()、dbrpcsend()返回成功之后调用dbresults()函数
  58. printf("then fetch results:\n");
  59. int count = ;
  60. while ((erc = dbresults(dbproc)) != NO_MORE_RESULTS) {
  61. struct col { //保存列的所有信息
  62. char *name; //列名字
  63. char *buffer; //存放列数据指针
  64. int type, size, status;
  65. } *columns, *pcol;
  66. int ncols;
  67. int row_code;
  68. if (erc == FAIL) {
  69. fprintf(stderr, "%s:%d: dbresults failed\n",
  70. argv[], __LINE__);
  71. exit();
  72. }
  73. ncols = dbnumcols(dbproc);//返回执行结果的列数目
  74. if ((columns = calloc(ncols, sizeof(struct col))) == NULL) {
  75. perror(NULL);
  76. exit();
  77. }
  78. /* read metadata and bind. */
  79. for (pcol = columns; pcol - columns < ncols; pcol++) {
  80. int c = pcol - columns + ;
  81. pcol->name = dbcolname(dbproc, c); //返回指定列的列名
  82. pcol->type = dbcoltype(dbproc, c);
  83. pcol->size = dbcollen(dbproc, c);
  84. printf("%*s(%d)", , pcol->name, pcol->size);
  85. if ((pcol->buffer = calloc(, )) == NULL) {
  86. perror(NULL);
  87. exit();
  88. }
  89. erc = dbbind(dbproc, c, NTBSTRINGBIND, , (BYTE*)pcol->buffer);
  90. if (erc == FAIL) {
  91. fprintf(stderr, "%s:%d: dbbind(%d) failed\n",
  92. argv[], __LINE__, c);
  93. exit();
  94. }
  95. erc = dbnullbind(dbproc, c, &pcol->status); //(5)
  96. if (erc == FAIL) {
  97. fprintf(stderr, "%s:%d: dbnullbind(%d) failed\n",
  98. argv[], __LINE__, c);
  99. exit();
  100. }
  101. }
  102. printf("\n");
  103. /* 打印数据 */
  104. while ((row_code = dbnextrow(dbproc)) != NO_MORE_ROWS) {//读取行数据
  105. switch (row_code) {
  106. case REG_ROW:
  107. for (pcol = columns; pcol - columns < ncols; pcol++) {
  108. char *buffer = pcol->status == - ?
  109. "null" : pcol->buffer;
  110. printf("%*s ", , buffer);
  111. }
  112. printf("\n"); break;
  113. case BUF_FULL: break;
  114. case FAIL:
  115. fprintf(stderr, "%s:%d: dbresults failed\n",
  116. argv[], __LINE__);
  117. exit(); break;
  118. default: // (7)
  119. printf("data for computeid %d ignored\n", row_code);
  120. }
  121. }
  122. /* free metadata and data buffers */
  123. for (pcol = columns; pcol - columns < ncols; pcol++) {
  124. free(pcol->buffer);
  125. }
  126. free(columns);
  127. if (DBCOUNT(dbproc) > -) /* 得到SQL语句影响的行数 */
  128. fprintf(stderr, "%d rows affected\n", DBCOUNT(dbproc))
  129. }
  130. dbclose(dbproc);
  131. dbexit();
  132. }

freetds简介、安装、配置及使用介绍的更多相关文章

  1. 01 Node.js简介, 安装&配置

    Node.js 简介 Node.js 是什么 Node.js 有着强大而灵活的包管理器(node package manager,npm) 目前, 已经有强大第三方工具模块, 例如数据库连接, 网站开 ...

  2. Hbase简介安装配置

    HBase —— Hadoop Database的简称 ,hbase 是分布式,稀疏的,持久化的,多维有序映射,它基于行键rowkey,列键column key,时间戳timestamp建立索引.它是 ...

  3. ansible简介安装配置

    ansible简介 ansible是一款,自动化运维管理工具.顾名思义是用于批量去管理及安装服务及批量管理主机. ansible与saltstack对比 ansible优点:配置简单,部署容易除主管理 ...

  4. 【转】hive简介安装 配置常见问题和例子

    原文来自:  http://blog.csdn.net/zhumin726/article/details/8027802 1 HIVE概述 Hive是基于Hadoop的一个数据仓库工具,可以将结构化 ...

  5. 第【一】部分Netzob项目工具的安装配置

    第[一]部分Netzob项目工具的安装配置 声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途. 2)若本文档内有侵权文字或图片等内容,请联系作者bitp ...

  6. 高手指南PHP安装配置

    高手指南PHP安装配置 2014-11-05 12:57:13   来源:   评论:0 次 点击:12 次 | 发布人:登陆查看   PHP的快速发展,它的功能越来越强大,运用它也变得很方便,下面我 ...

  7. Windows下安装配置MongoDB

    Windows下安装配置MongoDB 一,介绍 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB ...

  8. CentOS6.9快速安装配置svn

    CentOS6.9快速安装配置svn 环境介绍: 操作系统:CentOS release 6.9 (Final)192.168.65.130 (svn服务器)192.168.65.129 (svn客户 ...

  9. Linux下DHCP服务安装配置

    简介 安装配置 一.简介 DHCP (Dynamic Host Configuration Protocol,动态主机管理协议)是一种基于UDP协议且仅限用于局域网的网络协议,主要用途是为局域网内部设 ...

  10. GitHub 安装配置

    1:到 Github 注册 页面中注册,填写用户名.邮箱和密码 选择免费服务 步骤三可以根据自身喜好勾选或者直接跳过 2.1.2 创建远程仓库 创建完账号后,可以开始创建仓库 但是这里我们还没有验证邮 ...

随机推荐

  1. 8-3 Bits Equalizer uva12545

    题意: 给出字符串s包含'0' '1' '?'; 再给出字符串t只包含01: 现在我们可以对S做三个操作:把0变成1,把?变成0或1,任意两个位置交换: 问最少操作几次s == t: 贪心 默认除去那 ...

  2. nginx中配置文件的讲解

    一: 1.配置文件的结构 nginx由配置文件中指定的指令控制的模块组成. 指令分为简单指令和块指令. 一个简单的指令由空格分隔的名称和参数组成,并以分号(;)结尾. 块指令具有与简单指令相同的结构, ...

  3. Inno Setup使用

    Inno Setup是一个开源的安装包打包软件,下载地址是:http://www.jrsoftware.org/isdl.php 使用引导界面创建一个安装包打包 配置参考官方文档:http://www ...

  4. Ionic实战六:日期选择控件

    onic日期选择控件,用于ionic项目开发中的日期选择以及日期插件   

  5. Java_正则表达式&时间日期

    正则表达式 1.概念 正则表达式(英语:Regular Expression,在代码中常简写为regex). 正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个句法规则 ...

  6. JSP九大内置对象简介

    1.out对象,是JspWriter类的实例,是向客户端输出内容常用的对象 方法: void println() 向客户端打印字符串 void clear() 清除缓冲区的内容,如果在flush之后调 ...

  7. Java 中类的初始化过程

    先来一张 JVM 中的内存模型 . 在Java 虚拟机原理这本书中介绍了类会被初始化的 5 种情况 . 1 遇到 new getstatic putstatic 和 invokestatic 这 4 ...

  8. php操作mongodb or查询这样写!

    $where['$or'] = [ ['id' => ['lt'=>0]], ['id2' => ['lt'=>1]] ]; 这个是查询 id>0 或者id2>1的 ...

  9. Vue图片懒加载插件

    图片懒加载是一个很常用的功能,特别是一些电商平台,这对性能优化至关重要.今天就用vue来实现一个图片懒加载的插件. 这篇博客采用"三步走"战略--Vue.use().Vue.dir ...

  10. splice() 的用法

    splice splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素: var arr = ['Microsoft', 'Apple', ' ...