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ファイル:
このファイルではglobalがすべてのデータベースにtdsバージョン4.2を使用するように設定していますが、myserver 2で使用されるバージョンは5.0です.myserver 2にこれがない場合は、4.2バージョンのmyserverを使用します.
構成項目は次のように説明されます.
FreeTDS関数
インスタンスコード
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 }