[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 數據庫 > MySQL > 正文
MySQL中文參考手冊---16 MySQL對ODBC的支持
http://linuxdb.yeah.net 譯者:晏子 (2001-05-14 12:05:34)

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工作:
  • 你應該在桌中有主鍵。
  • 你應該在所有你想要能被修改的表中有一個時間戳記。
  • 僅使用雙精度浮點數的字段。當用單精度浮點數進行比較時,Access失敗。
  • 當與MySQL連接時,設置“Return matching rows”(返回匹配的行)選項域。
  • 在NT上的Access將報告BLOB列為OLE OBJECTS。如果你想要有MEMO列,你應該用ALTER TABLE把列改成TEXT
  • Access不能總是正確地處理DATE列。如果你對此有一個問題,把列改為DATETIME
  • 在一些情況下,Access可以產生不合法的SQL查詢,而MySQL不能理解。你可以通過從Access菜單"Query|SQLSpecific|Pass-Through"來修正它。
DataJunction
你必須改變它來輸出VARCHAR而非ENUM,因為它以能引起MySQL困惑的方式導出者。
Execl
工作。一些建議:
  • 如果你對日期有問題,試著使用CONCAT()函數作為字符串選擇他們。例如:
    select CONCAT(rise_time), CONCAT(set_time)
        from sunrise_sunset;
    

    這種方式作為字符串檢索出的值應該被Excel97識別為時間值,例子中CONCAT()的目的是欺騙ODBC認為列是“字符串類型”。沒有CONCAT(),ODBC知道列是時間類型,而Excel不理解它。注意這是Excel的一個錯誤,因為它自動將一個字符串轉換為一個時間。如果數據源是一個文本文件,這問題將很大,但是當數據源是對每列報告準確類型的一個ODBC連接時,只是有點傻。

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種可能性來指定服務器名:

  • 使用服務器的IP地址。
  • 增加一個文件“lmhosts”,具有下列信息:
    ip hostname
    

    例如:

    194.216.84.21 my
  • 設置PC以使用DNS。

怎填寫“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服務器做完全一樣的事情。

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

(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
MySQL中文參考手冊--8.MySQL教程--8.7 雙胞胎項目的查詢(實例) (2001-07-22 18:24:01)
MySQL中文參考手冊--8.MySQL教程--8.6 以批處理模式使用mysql (2001-07-22 18:23:47)
MySQL中文參考手冊--8.MySQL教程--8.5 獲得數據庫和表的信息 (2001-07-22 18:23:34)
MySQL中文參考手冊--8.MySQL教程--8.4 創造並使用一個數據庫 (2001-07-22 18:22:59)
MySQL中文參考手冊--8.MySQL教程--8.3 常用查詢的例子 (2001-07-22 18:22:34)
MySQL中文參考手冊--8.MySQL教程--8.2 輸入查詢 (2001-07-22 18:22:15)
MySQL中文參考手冊--8.MySQL教程--8.1 連接與斷開服務者 (2001-05-27 10:37:07)
MySQL中文參考手冊---21 怎樣對比MySQL與其他數據庫 (2001-05-14 12:11:51)
MySQL中文參考手冊---20 MySQL客戶工具和API (2001-05-14 12:10:54)
MySQL中文參考手冊---19 用MySQL解決一些常見問題 (2001-05-14 12:09:09)

===更多相關===
 

★  樊強制作 歡迎分享  ★