mysql-logo.gif (3082 bytes)MySQL中文參考手冊

翻譯:晏子(yanzi)       主頁:http://linuxdb.yeah.net


第一章, 前一章, 下一章, 最後一章目錄.


16 MySQL對ODBC的支持

MySQL利用MyODBC程序為ODBC提供支持。

16.1 MyODBC支持的操作系統

MyODBC是在Windows95和Windows NT上的一個32位ODBC(2.50) level 0驅動程序。我們希望誰能將它移植到Windows 3.x。

16.2 怎樣報告MyODBC的問題

MyODBC已經用Acess、Admndemo.exe、C++ Builder、Centura Team Developer(早先是Gupta SQL/Windows)、ColdFusion(在Solaris和用Server Pack 5的NT上)、Crystal Reports、DataJunction、Notes 4.5/4.6、SBSS、Perl DBD-ODBC、Paradox、Powerbuilder、Powerdesigner 32位、VC++和Visual Basic。

如果你聽說有任何其他的應用程序用MyODBC一起工作,請把它寄到myodbc@lists.mysql.com

16.3 已知可用MyODBC工作的程序

大多數程序應該可用MyODBC工作,但對下面列出的每一個,我們自己測試了它或從它運行的一些用戶得到了証實:

程序
說明
Access
為使Access工作:
DataJunction
你必須改變它來輸出VARCHAR而非ENUM,因為它以能引起MySQL困惑的方式導出後者。
Execl
工作。一些建議:
odbcadmin
為ODBC的測試程序。
Delphi
你必須使用DBE 3.2或更新。當與MySQL連接時,設置“Don't optimize column width”(不優化列寬度)選項域。另外,有一些潛在有用的delphi代碼安裝一個ODBC入口和針對MyODBC的一個BDE的入口(BDE入口需要一個BDE Alias Editor,可以到Delphi Super Page上免費擁有):(感謝Bryan Brunton bryan@flesherfab.com
fReg:= TRegistry.Create;
  fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True);
  fReg.WriteString('Database', 'Documents');
  fReg.WriteString('Description', ' ');
  fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll');
  fReg.WriteString('Flag', '1');
  fReg.WriteString('Password', '');
  fReg.WriteString('Port', ' ');
  fReg.WriteString('Server', 'xmark');
  fReg.WriteString('User', 'winuser');
  fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True);
  fReg.WriteString('DocumentsFab', 'MySQL');
  fReg.CloseKey;
  fReg.Free;

  Memo1.Lines.Add('DATABASE NAME=');
  Memo1.Lines.Add('USER NAME=');
  Memo1.Lines.Add('ODBC DSN=DocumentsFab');
  Memo1.Lines.Add('OPEN MODE=READ/WRITE');
  Memo1.Lines.Add('BATCH COUNT=200');
  Memo1.Lines.Add('LANGDRIVER=');
  Memo1.Lines.Add('MAX ROWS=-1');
  Memo1.Lines.Add('SCHEMA CACHE DIR=');
  Memo1.Lines.Add('SCHEMA CACHE SIZE=8');
  Memo1.Lines.Add('SCHEMA CACHE TIME=-1');
  Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
  Memo1.Lines.Add('SQLQRYMODE=');
  Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE');
  Memo1.Lines.Add('ENABLE BCD=FALSE');
  Memo1.Lines.Add('ROWSET SIZE=20');
  Memo1.Lines.Add('BLOBS TO CACHE=64');
  Memo1.Lines.Add('BLOB SIZE=32');

  AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
C++Builder
用BDE 3.0測試過。唯一知道的問題是,當表框架改變時,差詢字段不被更新。然而BDE似乎認不出主鍵,只是索引PRIMARY,盡管這已經不是個問題。
Visual Basic
為了能更新一張表,你必須為表定義一個主鍵。

16.4 怎樣填寫ODBC管理程序的各種域

在Windows95上,有3種可能性來指定服務器名:

怎麼填寫“ODBC設置”的例子:

Windows DSN name:   test
Description:        This is my test database
MySql Database:     test
Server:             194.216.84.21
User:               monty
Password:           my_password
Port:

Windows DSN name域的值是在你的Windows ODBC設置中唯一的任何名字。

你不必為在ODBC設置屏的Server, User, PasswordPort域指定值。然而如果你這樣做,當你試圖做一個連接時,這些值將在以後作為缺省值使用,那時你有改變值的選擇。

如果沒給出端口號,使用缺省端口(3306)。

如果你指定選項Read options from C:\my.cnf,組clientodbc將從“C:\my.cnf”文件中讀出。你可以使用可用于mysql_options()的所有選項。見20.4.37 mysql_options()

16.5 怎樣在ODBC中獲得一個AUTO_INCREMENT列的值

一個常見的問題是怎樣得到一個自動從一個INSERT產生的ID值,用ODBC,你可以這樣做(假定auto是一個AUTO_INCREMENT字段):

INSERT INTO foo (auto,text) VALUES(NULL,'text');
SELECT LAST_INSERT_ID();

或,如果你是只是想把ID插入到另外一個表中,你可以這樣做:

INSERT INTO foo (auto,text) VALUES(NULL,'text');
INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');

得益于一些ODBC應用程序(至少Delphi和Access),下列查詢可被用來找出最新插入的行:

SELECT * FROM tbl_name WHERE auto IS NULL;

16.6 報告MyODBC的問題

如果你碰到MyODBC困難,你應該通過ODBC管理器制作一個日志文件(當從ODBCADMIN要求日志時,你獲得的日志文件)和一個MyODBC日志文件來開始。為了獲得一個MyODBC日志文件,在MyODBC連接/配置屏幕上標注“Trace MyODBC”選項標志。日志文件將被寫入文件“C:\myodbc.log”。注意為了此選項起作用,你必須使用MYSQL.DLL而不是MYSQL2.DLL

檢查MyODBC發給MySQL服務器的查詢;你應該可以通過在“myodbc.log”文件中尋找字符串>mysql_real_query找到它。

你也應該試著在mysql監視器或admndemo中重複查詢以找出是MyODBC出錯還是MySQL出錯。

如果你發現某些東西是錯的,請值將相關的行(最大40排)發到myodbc@lists.mysql.com。請決不要發送整個MyODBC或ODBC日志文件!

如果你不能找出是什麼錯誤,最後的選擇制作一個檔案(tar或zip),包含一個MyODBC日志文件,ODBC日志文件和一個解釋這個問題的 README文件。你可以把這發到ftp://www.mysql.com/pub/mysql/secret。至于在TCX的我們能訪問你上載的文件並且我們將分離數據!

如果你能創造一個也顯示出這個問題的程序,請也上載它!

如果程序與一些其他SQL服務器一起工作,你應該制作一個 ODBC 日志文件,在哪兒你在其他SQL服務器做完全一樣的事情。

記住,你能提供我們越多的信息,我們越可能解決這個問題!


第一章, 前一章, 下一章, 最後一章目錄.