freetdsの概要、インストール、構成、および使用方法の説明

28838 ワード

FreeTDSとは簡単に言えば、FreeTDSはライブラリであり、Linuxシステムの下でマイクロソフトのSQLデータベースにアクセスすることができます!FreeTDSはオープンソース(フリーと呼ぶことができる)のライブラリであり、TDS(テーブル列データストリーム)プロトコルの再実装である.Sybaseのdb-libまたはct-libライブラリで使用できます.ODBCのライブラリも含まれています.PerlやPHP(または独自のcまたはC++プログラム)など、多くのオープンソースアプリケーションをSybaseまたはMicrosoft SQLサーバに接続できます.FreeTDSはソースコードとして発行され、ほとんどのオペレーティングシステムでコンパイルすることができる.UnixおよびクラスUnixシステム(InterixおよびQNXなどの有名なブランチを含む)、Win 32、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]セクションの2つに分けられ、[dataserver]はデータベースに対応します.golbalでの設定はすべてのデータベースで機能しますが、dataserverセクションでの設定は自分のデータベースでのみ機能し、グローバルな設定を上書きできます.
例:freetds.confファイル:
1 [global] 
2 tds version = 4.2 
3 [myserver] 
4 host = ntbox.mydomain.com 
5 port = 1433 
6 [myserver2] 
7 host = unixbox.mydomain.com 
8 port = 4000 
9 tds version = 5.0

このファイルではglobalがすべてのデータベースにtdsバージョン4.2を使用するように設定していますが、myserver 2で使用されるバージョンは5.0です.myserver 2にこれがない場合は、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);

 
インスタンスコード
  1 #include 
  2 #include 
  3 #include <string.h>
  4 #include 
  5 #include  /* sqlfront.h always comes first */
  6 #include  /* 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
", argv[0], __LINE__); 24 exit(1); 25 } 26 //dblogin() LOGINREC , dbopen() , 。 27 // , !. 28 if ((login = dblogin()) == NULL) { 29 fprintf(stderr, "%s:%d: unable to allocate login structure
", argv[0], __LINE__); 30 exit(1); 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
", 39 argv[0], __LINE__, 40 SQLDBSERVER, SQLDBUSER); 41 exit(1); 42 } 43 // dbuser() , , . 44 if (SQLDBNAME && (erc = dbuse(dbproc, SQLDBNAME)) == FAIL) { 45 fprintf(stderr, "%s:%d: unable to use to database %s
", 46 argv[0], __LINE__, SQLDBNAME); 47 exit(1); 48 } 49 /*************************************************************/ 50 dbcmd(dbproc, DBSQLCMD);// SQL 51 printf("
"); 52 if ((erc = dbsqlexec(dbproc)) == FAIL) { 53 fprintf(stderr, "%s:%d: dbsqlexec() failed
", argv[0], __LINE__); 54 exit(1); // SQL , 。 55 } 56 /*************************************************************/ 57 // dbsqlexec()、dbsqlok()、dbrpcsend() dbresults() 58 printf("then fetch results:
"); 59 int count = 0; 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
", 70 argv[0], __LINE__); 71 exit(1); 72 } 73 ncols = dbnumcols(dbproc);// 74 if ((columns = calloc(ncols, sizeof(struct col))) == NULL) { 75 perror(NULL); 76 exit(1); 77 } 78 /* read metadata and bind. */ 79 for (pcol = columns; pcol - columns < ncols; pcol++) { 80 int c = pcol - columns + 1; 81 pcol->name = dbcolname(dbproc, c); // 82 pcol->type = dbcoltype(dbproc, c); 83 pcol->size = dbcollen(dbproc, c); 84 printf("%*s(%d)", 20, pcol->name, pcol->size); 85 if ((pcol->buffer = calloc(1, 20)) == NULL) { 86 perror(NULL); 87 exit(1); 88 } 89 erc = dbbind(dbproc, c, NTBSTRINGBIND, 20, (BYTE*)pcol->buffer); 90 if (erc == FAIL) { 91 fprintf(stderr, "%s:%d: dbbind(%d) failed
", 92 argv[0], __LINE__, c); 93 exit(1); 94 } 95 erc = dbnullbind(dbproc, c, &pcol->status); //(5) 96 if (erc == FAIL) { 97 fprintf(stderr, "%s:%d: dbnullbind(%d) failed
", 98 argv[0], __LINE__, c); 99 exit(1); 100 } 101 } 102 printf("
"); 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 == -1 ? 109 "null" : pcol->buffer; 110 printf("%*s ", 20, buffer); 111 } 112 printf("
"); break; 113 case BUF_FULL: break; 114 case FAIL: 115 fprintf(stderr, "%s:%d: dbresults failed
", 116 argv[0], __LINE__); 117 exit(1); break; 118 default: // (7) 119 printf("data for computeid %d ignored
", 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) > -1) /* SQL */ 128 fprintf(stderr, "%d rows affected
", DBCOUNT(dbproc)) 129 } 130 dbclose(dbproc); 131 dbexit(); 132 }