FreeTDS
78129 ワード
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を意味する.もしそれがあなたのシステムでコンパイルできないならば–そしてあなたはMS DOSを使用していません–これはbugかもしれません.FreeTDSのインストール1.ダウンロードfreetds-0.63バージョン(0.63版は中国語をサポートするため)、このダウンロードをクリックしますhttp://www.ibiblio.org/pub/Linux/ALPHA/freetds/old/0.63/freetds-0.63.tar.gz2.任意のディレクトリに解凍し、解凍したフォルダに入ります.3.rootに切り替え、設定:./configure–prefix=/usr/local/freetds–with-tdsver=8.0–enable-msdblib解釈:–prefixはFreeTDSのインストールディレクトリを設定し、–with-tdsverはTDSバージョンを設定し、–enable-msdblibはMicrosoftデータベース関数ライブラリ4を許可するかどうかである.make & make install5.配置環境変数:vim~/.bashrcこのファイルに追加:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/freetds/lib/インストールリファレンスについて:http://linux.chinaunix.net/techdoc/database/2008/10/31/1042291.shtmlまたは、http://www.linuxdiyf.com/viewarticle.php?id=109086FreeTDSの構成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 version=4.2[myserver]host=ntbox.mydomain.comport = 1433[myserver2]host = unixbox.mydomain.comport=4000 tds version=5.0このファイルでglobal設定のすべてのデータベースはtdsバージョン4.2を使用しますが、myserver 2で使用されるバージョンは5.0です.myserver 2にこれがない場合は、myserverのような4.2バージョンを使用します.
その構成項目は、tds version:tdsプロトコルのバージョンを指定し、データベースに接続する際に使用し、環境変数に設定されていない場合、この構成によって決定され、プロトコルバージョンは4.2,5.0,7.0,8.0とすることができる.host:データベースサーバーのホスト名またはipアドレス.port:データベースサーバーの傍受ポートは、有効なポート値を取ることができる.一般的にSybase SQL 10は以前は1433、10以上は5000だったが、Sybase SQLAnywhere 7は2638、Microsoft SQL serverは1433だった.この構成は、環境変数のTDSPORTによって書き換えられます.initial block size:この値は512の倍数しか取れません.デフォルトは512で、プロトコルブロックの最大値を指定しています.一般的にこのデフォルト構成は変更しないでください.dump file:有効なファイル名で、ダンプされたファイルのパスを指定し、ログを開きます.dump file append:yesまたはnoは、dump fileファイルに追加保存するかどうかを決定します.timeout:処理の最大待ち時間を設定する.connect timeout:接続の最大待ち時間を設定します.emulate little endian:yesまたはno、大端末にMS Serverとの通信を強制するかどうか.client charset:有効なiconv文字セット.デフォルト値はISO-8859-1で、FreeTDSがiconvを使用してデータベース・サーバとユーザー・プログラムの間で変換されます.FreeTDS関数RETCODE dbinit(void):機能:このライブラリを使用する前にこの関数を呼び出し、複数の内部変数に空間を申請し、localesを読み出す.conf(/usr/local/freetds/etcディレクトリの下)ファイルは日付フォーマットを決定します.戻り値:SUCCEED(成功)、FAIL(失敗)LOGINREC*dblogin(void):機能:LOGINREC構造体を申請する.この構造体はdbopen()関数に渡され、データベースへの接続を作成します.戻り値:NULL、LOGINREC構造体に申請していません.そうしないと合法的なアドレスです.DBPOCESS*dbopen()機能:サーバーが接続を確立する.LOGINRECポインタとサーバー名の戻り値を渡す:成功すればDBPOMESS構造体ポインタを返し、サーバーに接続されているすべての情報を保存するRETCODE dbcmd(DBPOMESS*dbproc,const char*cmdstring)機能:SQL文をコマンドバッファに入力し、cmdstringに入力するSQL文文字列.戻り値:SUCCEEDが正常に戻りました.FAILに失敗し、十分なメモリがありません.RETCODE dbsqlexec(DBPOCESS*dbproc)機能:SQL文をサーバに送信し、戻るのを待つ.戻り値:SUCCEED:実行成功、FAIL、失敗FreeTDS使用例
その構成項目は、tds version:tdsプロトコルのバージョンを指定し、データベースに接続する際に使用し、環境変数に設定されていない場合、この構成によって決定され、プロトコルバージョンは4.2,5.0,7.0,8.0とすることができる.host:データベースサーバーのホスト名またはipアドレス.port:データベースサーバーの傍受ポートは、有効なポート値を取ることができる.一般的にSybase SQL 10は以前は1433、10以上は5000だったが、Sybase SQLAnywhere 7は2638、Microsoft SQL serverは1433だった.この構成は、環境変数のTDSPORTによって書き換えられます.initial block size:この値は512の倍数しか取れません.デフォルトは512で、プロトコルブロックの最大値を指定しています.一般的にこのデフォルト構成は変更しないでください.dump file:有効なファイル名で、ダンプされたファイルのパスを指定し、ログを開きます.dump file append:yesまたはnoは、dump fileファイルに追加保存するかどうかを決定します.timeout:処理の最大待ち時間を設定する.connect timeout:接続の最大待ち時間を設定します.emulate little endian:yesまたはno、大端末にMS Serverとの通信を強制するかどうか.client charset:有効なiconv文字セット.デフォルト値はISO-8859-1で、FreeTDSがiconvを使用してデータベース・サーバとユーザー・プログラムの間で変換されます.FreeTDS関数RETCODE dbinit(void):機能:このライブラリを使用する前にこの関数を呼び出し、複数の内部変数に空間を申請し、localesを読み出す.conf(/usr/local/freetds/etcディレクトリの下)ファイルは日付フォーマットを決定します.戻り値:SUCCEED(成功)、FAIL(失敗)LOGINREC*dblogin(void):機能:LOGINREC構造体を申請する.この構造体はdbopen()関数に渡され、データベースへの接続を作成します.戻り値:NULL、LOGINREC構造体に申請していません.そうしないと合法的なアドレスです.DBPOCESS*dbopen()機能:サーバーが接続を確立する.LOGINRECポインタとサーバー名の戻り値を渡す:成功すればDBPOMESS構造体ポインタを返し、サーバーに接続されているすべての情報を保存するRETCODE dbcmd(DBPOMESS*dbproc,const char*cmdstring)機能:SQL文をコマンドバッファに入力し、cmdstringに入力するSQL文文字列.戻り値:SUCCEEDが正常に戻りました.FAILに失敗し、十分なメモリがありません.RETCODE dbsqlexec(DBPOCESS*dbproc)機能:SQL文をサーバに送信し、戻るのを待つ.戻り値:SUCCEED:実行成功、FAIL、失敗FreeTDS使用例
1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <string.h>
4. #include <unistd.h>
5.
6. #include <sqlfront.h> /* sqlfront.h always comes first */
7. #include <sybdb.h> /* sybdb.h is the only other file you need */
8.
9. #define SQLDBIP " " //SQL IP
10. #define SQLDBPORT " " //SQL
11. #define SQLDBNAME " " //SQL
12. #define SQLDBUSER " " //SQL
13. #define SQLDBPASSWD " " //SQL
14. #define SQLDBSERVER SQLDBIP":"SQLDBPORT
15.
16. #define DBSQLCMD "select * from yancao"
17.
18. int main(int argc, char *argv[])
19. {
20. int i, ch;
21. LOGINREC *login; // , .
22. DBPROCESS *dbproc; // , dbopen()
23. RETCODE erc; // .
24.
25. /*******************************************************************/
26. // dbinit()
27. if (dbinit() == FAIL) {
28. fprintf(stderr, "%s:%d: dbinit() failed
",
29. argv[0], __LINE__);
30. exit(1);
31. }
32. //dblogin() LOGINREC , dbopen() , 。
33. // , !.
34. if ((login = dblogin()) == NULL) {
35. fprintf(stderr, "%s:%d: unable to allocate login structure
",
36. argv[0], __LINE__);
37. exit(1);
38. }
39. //LOGINREC , ,
40. DBSETLUSER(login, SQLDBUSER);
41. DBSETLPWD(login, SQLDBPASSWD);
42. /***************************************************************/
43. //dbopen() . LOGINREC
44. if ((dbproc = dbopen(login, SQLDBSERVER)) == NULL) {
45. fprintf(stderr, "%s:%d: unable to connect to %s as %s
",
46. argv[0], __LINE__,
47. SQLDBSERVER, SQLDBUSER);
48. exit(1);
49. }
50. // dbuser() , , .
51. if (SQLDBNAME && (erc = dbuse(dbproc, SQLDBNAME)) == FAIL) {
52. fprintf(stderr, "%s:%d: unable to use to database %s
",
53. argv[0], __LINE__, SQLDBNAME);
54. exit(1);
55. }
56. /*****************************************************************/
57. dbcmd(dbproc, DBSQLCMD);// SQL
58. printf("
");
59. if ((erc = dbsqlexec(dbproc)) == FAIL) {
60. fprintf(stderr, "%s:%d: dbsqlexec() failed
", argv[0], __LINE__);
61. exit(1); // SQL , 。
62. }
63. /****************************************************************/
64. // dbsqlexec()、dbsqlok()、dbrpcsend() dbresults()
65. printf("then fetch results:
");
66. int count = 0;
67. while ((erc = dbresults(dbproc)) != NO_MORE_RESULTS) {
68. struct col { //
69. char *name; //
70. char *buffer; //
71. int type, size, status;
72. } *columns, *pcol;
73. int ncols;
74. int row_code;
75. if (erc == FAIL) {
76. fprintf(stderr, "%s:%d: dbresults failed
",
77. argv[0], __LINE__);
78. exit(1);
79. }
80. ncols = dbnumcols(dbproc);//
81. if ((columns = calloc(ncols, sizeof(struct col))) == NULL) {
82. perror(NULL);
83. exit(1);
84. }
85. /* read metadata and bind. */
86. for (pcol = columns; pcol - columns < ncols; pcol++) {
87. int c = pcol - columns + 1;
88. pcol->name = dbcolname(dbproc, c); //
89. pcol->type = dbcoltype(dbproc, c);
90. pcol->size = dbcollen(dbproc, c);
91. printf("%*s(%d)", 20, pcol->name, pcol->size);
92. if ((pcol->buffer = calloc(1, 20)) == NULL) {
93. perror(NULL);
94. exit(1);
95. }
96. erc = dbbind(dbproc, c, NTBSTRINGBIND, //??
97. 20, (BYTE*)pcol->buffer);
98. if (erc == FAIL) {
99. fprintf(stderr, "%s:%d: dbbind(%d) failed
",
100. argv[0], __LINE__, c);
101. exit(1);
102. }
103. erc = dbnullbind(dbproc, c, &pcol->status); //(5)
104. if (erc == FAIL) {
105. fprintf(stderr, "%s:%d: dbnullbind(%d) failed
",
106. argv[0], __LINE__, c);
107. exit(1);
108. }
109. }
110. printf("
");
111. /* */
112. while ((row_code = dbnextrow(dbproc)) != NO_MORE_ROWS) {//
113. switch (row_code) {
114. case REG_ROW:
115. for (pcol=columns; pcol - columns < ncols; pcol++) {
116. char *buffer = pcol->status == -1?
117. "null" : pcol->buffer;
118. printf("%*s ", 20, buffer);
119. }
120. printf("
"); break;
121. case BUF_FULL: break;
122. case FAIL:
123. fprintf(stderr, "%s:%d: dbresults failed
",
124. argv[0], __LINE__);
125. exit(1); break;
126. default: // (7)
127. printf("data for computeid %d ignored
", row_code);
128. }
129. }
130. /* free metadata and data buffers */
131. for (pcol=columns; pcol - columns < ncols; pcol++) {
132. free(pcol->buffer);
133. }
134. free(columns);
135. if (DBCOUNT(dbproc) > -1) /* SQL */
136. fprintf(stderr, "%d rows affected
", DBCOUNT(dbproc))
137. }
138. dbclose(dbproc);
139. dbexit();
140. }