freetds相关

什么是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.ibiblio.org/pub/Linux/ALPHA/freetds/old/0.63/freetds-0.63.tar.gz

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

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

4.make & make install

5.配置环境变量:vim ~/.bashrc向此文件中加入: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/freetds/lib/

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文件:

[global]
tds version = 4.2
[myserver]
host = ntbox.mydomain.com
port = 1433
[myserver2]
host = unixbox.mydomain.com
port = 4000
tds version = 5.0 

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

其配置项解释如下:

ltds version       : 指明tds协议的版本,连接数据库时使用,如果在环境变量中没有设置 此项,则由此配置决定,协议版本可取4.2,5.0,7.0,8.0。

lhost                 : 数据库服务器的主机名或者ip地址。

lport                 : 数据库服务器的监听端口,可以取任何有效的端口值,一般而言Sybase SQL10以前为 1433,10以上用5000,而Sybase SQLAnywhere 7是2638,Microsoft SQL server则用 1433。此配置可以被环境变量中的TDSPORT改写。

linitial block size : 此值只能取512的倍数,默认为512,指定了协议块的最大值, 一般不要改变此默认 配置。

ldump file          : 任何有效的文件名,指明了转储文件的路径并且会打开日志记录。

ldump file append: yes或者no,决定是否追加保存到dump file文件中。

ltimeout            :设置处理的最大等待时间。

lconnect timeout: 设置连接的最大等待时间。

lemulate little endian: yes或者no,是否强制大端机使用小端方式与MS Server通信。

lclient charset   : 任何有效的iconv字符集。默认值为ISO-8859-1,使FreeTDS使用 iconv在数据库服务器和用户程序之间转换。

FreeTDS函数

1. Dbcmd和dbfcmd

函数原形: Dbcmd(DBPROCESS *proc,char * sql);

     Dbcmd(DBPROCESS *proc, char * format,char *args);

功      能:该函数主要是构造sql语句,一个是带参数的,一个不带参数。

2. Dbsqlexec

函数原形:Dbsqlexec(DBPROCESS *proc);

功      能:该函数负责执行你所构造的sql语句。

3. Dbresults

函数原形:Dbrerults(DBPROCESS *proc);

功      能:得到sql语句的执行结果。返回值如果为NO_MORE_RESULTS=0,表明sql查询为空值(就是没有一条满足条件的结果),如果为(FAIL)=-1,表明查询出错,如果为(SUCCESS)=1,表明有结果且不为空。

4. DBROWS(全大写)

函数原形:DBROWS(DBPROCESS *proc);

功      能:取出一行记录的信息。

5. Dbbind

函数原形:Dbbind(DBPROCESS *proc,int colmn,

功      能:将sql查询出来的结果绑定到一个变量。第一个参数为从数据库那里拿的句柄,第二个参数是对应你的select语句中查询需要的字段(注:必须是按照select顺序绑定的,例如select user,password from hist1 ,如果值为1,就是绑定的user),第三个参数是绑定字段的类型,最后一个参数是绑定的变量。

6.    Dbnextrow

函数原形:Dbnextrow(DBPROCESS *proc);

功      能:该函数将取出满足sql语句的每一行,返回值为0,代表处理结束,返回值为-1出错。

7.  Dbcancel

函数原形:Dbcancel(DBPROCESS *proc);

功      能:清空上次查询得到的数据集,如果是一个句柄的话,每次重新执行select语句之前都要调用它清空结果,不然数据库会报错的。

8. Dbclose

函数原形:Dbclose(DBPROCESS *proc);

功      能:关闭句柄。当不再使用时必须关闭句柄。

9.  Dbinit

函数原形:Dbinit()

功      能:初识化数据库连接。返回值为-1出错。

10. Dblogin

函数原形:LOGINREC       *Dblogin();

DBSETLUSER(login,SOFT);  //set the database user

DBSETLPWD(login,SOFTPASS);//set password

功     能:根据用户名和密码连接数据库。

11.Dbcount

函数原形:Dbcount(DBPROCESS *proc);

功      能:该函数将得到sql结果集被处理的行数,可以用它来判断你的select语句是否得到正确的处理。

12.Dbopen

函数原形:DBPROCESS * Dbopen(LOGINREC     *login,NULL);

功      能:返回一个操作数据库的句柄。

另外再介绍两个关于数据库的出错信息的函数:

dberrhandle(int *err);

dbmsghandle(int* err);

实例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sqlfront.h> /* sqlfront.h always comes first */
#include <sybdb.h> /* sybdb.h is the only other file you need */
#define SQLDBIP " " //SQL数据库服务器IP
#define SQLDBPORT " " //SQL数据库服务器端口
#define SQLDBNAME " " //SQL数据库服务器数据库名
#define SQLDBUSER " " //SQL数据库服务器数据库用户名
#define SQLDBPASSWD " " //SQL数据库服务器用户密码
#define SQLDBSERVER SQLDBIP":"SQLDBPORT
#define DBSQLCMD "select * from yancao"
int main(int argc, char *argv[])
{
    int i, ch;
    LOGINREC *login; //描述客户端的结构体,在连接时被传递到服务器.
    DBPROCESS *dbproc; //描述连接的结构体,被dbopen()函数返回
    RETCODE erc; //库函数中最普遍的返回类型.
/*************************************************************/
//在开始调用本库函数前常常要先调用dbinit()函数
    if (dbinit() == FAIL) {
        fprintf(stderr, "%s:%d: dbinit() failed\n",argv[0], __LINE__);
        exit(1);
     }
//dblogin()函数申请 LOGINREC 结构体,此结构体被传递给dbopen()函数,用来创建一个连接。
//虽然基本上不会调用失败,但是检查它!.
    if ((login = dblogin()) == NULL) {
        fprintf(stderr, "%s:%d: unable to allocate login structure\n",argv[0],__LINE__);
        exit(1);
    }
//LOGINREC结构体不能被直接访问,要通过以下宏设置,下面设置两个必不可少的域
    DBSETLUSER(login, SQLDBUSER);
    DBSETLPWD(login, SQLDBPASSWD);
/*************************************************************/
//dbopen()与服务器建立一个连接. 传递 LOGINREC 指针和服务器名字
     if ((dbproc = dbopen(login, SQLDBSERVER)) == NULL) {
        fprintf(stderr, "%s:%d: unable to connect to %s as %s\n",
 argv[0], __LINE__,
        SQLDBSERVER, SQLDBUSER);
        exit(1);
    }
// 可以调用dbuser()函数选择我们使用的数据库名,可以省略,省略后使用用户默认数据库.
     if (SQLDBNAME && (erc = dbuse(dbproc, SQLDBNAME)) == FAIL) {
        fprintf(stderr, "%s:%d: unable to use to database %s\n",
argv[0], __LINE__, SQLDBNAME);
         exit(1);
     }
/*************************************************************/
    dbcmd(dbproc, DBSQLCMD);//将SQL语句填充到命令缓冲区
     printf("\n");
    if ((erc = dbsqlexec(dbproc)) == FAIL) {
        fprintf(stderr, "%s:%d: dbsqlexec() failed\n", argv[0], __LINE__);
        exit(1); //等待服务器执行SQL语句,等待时间取决于查询的复杂度。
    }
/*************************************************************/
//在调用dbsqlexec()、dbsqlok()、dbrpcsend()返回成功之后调用dbresults()函数
    printf("then fetch results:\n");
    int count = 0;
    while ((erc = dbresults(dbproc)) != NO_MORE_RESULTS) {
        struct col { //保存列的所有信息
        char *name; //列名字
        char *buffer; //存放列数据指针
        int type, size, status;
    } *columns, *pcol;
    int ncols;
    int row_code;
    if (erc == FAIL) {
        fprintf(stderr, "%s:%d: dbresults failed\n",
argv[0], __LINE__);
        exit(1);
     }
    ncols = dbnumcols(dbproc);//返回执行结果的列数目
    if ((columns = calloc(ncols, sizeof(struct col))) == NULL) {
        perror(NULL);
        exit(1);
     }
 /* read metadata and bind. */
    for (pcol = columns; pcol - columns < ncols; pcol++) {
        int c = pcol - columns + 1;
         pcol->name = dbcolname(dbproc, c); //返回指定列的列名
        pcol->type = dbcoltype(dbproc, c);
        pcol->size = dbcollen(dbproc, c);
         printf("%*s(%d)", 20, pcol->name, pcol->size);
        if ((pcol->buffer = calloc(1, 20)) == NULL) {
        perror(NULL);
         exit(1);
    }
    erc = dbbind(dbproc, c, NTBSTRINGBIND, 20, (BYTE*)pcol->buffer);
    if (erc == FAIL) {
        fprintf(stderr, "%s:%d: dbbind(%d) failed\n",
argv[0], __LINE__, c);
        exit(1);
    }
    erc = dbnullbind(dbproc, c, &pcol->status); //(5)
     if (erc == FAIL) {
        fprintf(stderr, "%s:%d: dbnullbind(%d) failed\n",
argv[0], __LINE__, c);
        exit(1);
    }
 }
    printf("\n");
/* 打印数据 */
    while ((row_code = dbnextrow(dbproc)) != NO_MORE_ROWS) {//读取行数据
    switch (row_code) {
    case REG_ROW:
     for (pcol=columns; pcol - columns < ncols; pcol++) {
    char *buffer = pcol->status == -1?
"null" : pcol->buffer;
    printf("%*s ", 20, buffer);
    }
    printf("\n"); break;
    case BUF_FULL: break;
    case FAIL:
     fprintf(stderr, "%s:%d: dbresults failed\n",
     argv[0], __LINE__);
exit(1); break;
 default: // (7)
 printf("data for computeid %d ignored\n", row_code);
}
 }
 /* free metadata and data buffers */
 for (pcol=columns; pcol - columns < ncols; pcol++) {
free(pcol->buffer);
}
 free(columns);
if (DBCOUNT(dbproc) > -1) /* 得到SQL语句影响的行数 */
fprintf(stderr, "%d rows affected\n", DBCOUNT(dbproc))
}
dbclose(dbproc);
dbexit();
}                                           

freetds相关

时间: 2024-11-03 17:59:49

freetds相关的相关文章

Linux下用freetds执行SQL Server的sql语句和存储过程

http://www.linuxidc.com/Linux/2012-06/61617.htm freetds相关 http://www.knowsky.com/616936.html SHELL接受存储过程返回的值 http://blog.chinaunix.net/uid-22948773-id-3318716.html mybatis调用存储过程及返回值获取 http://blog.csdn.net/y666666y/article/details/70212368 如何调用存储过程,有返

QT unixODBC+freetds连接sqlserver并交叉编译移植到ARM上

最近产品需要做一个数据上传功能.客户要求直接写入SQLserver数据库.之前QT连接数据库是默认来年将诶sqlite数据库.由于sqlite是QT默认自带的操作起来比较简单,但是SQLserver QT没有带驱动所以需要安装驱动插件.下面我们来看一下是QT支持SQLServer所需要的插件. 一.unixODBC 二.QT的ODBC驱动 三. FreeTDS Ubuntu篇: 编译QT的ODBC驱动需要unixODBC,所以要先编译unixODBC 一.编译unixODBC 下载:http:/

linux使用pyodbc和freetds连接sqlserver

安装unixODBC 使用pyodbc需要Linux上安装unixODBC 可使用yum或apt安装unixODBC-devel包 编译安装:http://www.unixodbc.org/download.html 安装成功验证 #odbcinst -j unixODBC 2.3.7 DRIVERS............: /usr/local/etc/odbcinst.ini SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini FILE DATA SO

【Windows10&nbsp;IoT开发系列】PowerShell的相关配置

原文:[Windows10 IoT开发系列]PowerShell的相关配置 可使用 Windows PowerShell 远程配置和管理任何 Windows 10 IoT 核心版设备.PowerShell 是基于任务的命令行 Shell 和脚本语言,专为进行系统管理而设计. 1.​启动 PowerShell (PS) 会话 注:若要使用装有Windows10 IoT Core设备启动PS会话,首先需要在主机电脑与设备之间创建信任关系. ​启动 Windows IoT 核心版设备后,与该设备相连的

微信小程序--图片相关问题合辑

图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.previewImage预览图片 微信小程序之预览图片 小程序开发:上传图片到腾讯云 .NET开发微信小程序-上传图片到服务器 微信小程序本地图片处理--按屏幕尺寸插入图片 [微信小程序]上传图片到阿里云OSS Python Flask小程序文件(图片)上传技巧 小程序图片上传阿里OSS使用方法 微信小程序问题汇

Android studio界面相关设置

Android studio界面相关设置 原文出自 http://www.cnblogs.com/justinzhang/p/4274839.html 用惯了emacs的操作方式,每当使用一款新的编辑器的时候,第一个想到的就是这个工具有没有emacs的快捷键,Android studio也是一样的. 1. Android studio设置emacs的方式如下,点击File->Settings 选择其中的keymap,在keymap中选择emacs,这样就成功的设置好了emacs的操作模式: 2.

25个Linux相关的网站【转】

转自:http://www.cnblogs.com/Lindaman/p/4552805.html 下面是25个最具有影响力,也是最重要的Linux网站,这些网站提供了Linux的分发包,软件,文件,新闻,以及其它所有的关于Linux的东西.关于Linux的分发包历史,可以看看本站的这篇文章<Linux Distribution Timeline> 1. Linux.org 这个站点主要提供Linux相关的新闻.文档.教程,培训,以及其它一切和Linux相关的东西.这是你需要了解Linux开源

Halcon学习之二:摄像头获取图像和相关参数

1.close_all_framegrabbers ( : : : ) 关闭所有图像采集设备. 2.close_framegrabber ( : : AcqHandle : ) 关闭Handle为AcqHandle的图像采集设备. 3.open_framegrabber ( : : Name, HorizontalResolution, VerticalResolution, ImageWidth, ImageHeight, StartRow, StartColumn, Field, BitsP

第三百二十三节,web爬虫,scrapy模块以及相关依赖模块安装

第三百二十三节,web爬虫,scrapy模块以及相关依赖模块安装 当前环境python3.5 ,windows10系统 Linux系统安装 在线安装,会自动安装scrapy模块以及相关依赖模块 pip install Scrapy 手动源码安装,比较麻烦要自己手动安装scrapy模块以及依赖模块 安装以下模块 1.lxml-3.8.0.tar.gz (XML处理库) 2.Twisted-17.5.0.tar.bz2 (用Python编写的异步网络框架) 3.Scrapy-1.4.0.tar.gz