譯者:晏子 (clyan@sohu.com)
GB 碼主頁:http://linuxdb.yeah.net
Big5 轉碼者:statue
(statue@bbs.yzu.edu.tw)
詞彙轉換:彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁:
http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站:
http://php.wilson.gs/mysqldoc/big5/manual_toc.html
MySQL利用MyODBC程式為ODBC提供支援。
MyODBC是在Windows95和Windows NT上的一個32位ODBC(2.50) level 0驅動程式。我們希望誰能將它移植到Windows 3.x。
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!
大多數程式應該可用MyODBC工作,但對下面列出的每一個,我們自己測試了它或從它運行的一些用戶得到了証實:
BLOB
列為OLE OBJECTS
。如果你想要有MEMO
列,你應該用ALTER
TABLE
把列改成TEXT
。DATE
列。如果你對此有一個問題,把列改為DATETIME
。"Query|SQLSpecific|Pass-Through"
來修正它。VARCHAR
而非ENUM
,因為它以能引起MySQL困惑的方式導出後者。CONCAT()
函數作為字符串選擇他們。例如:select CONCAT(rise_time), CONCAT(set_time) from sunrise_sunset;
這種方式作為字符串檢索出的值應該被Excel97識別為時間值,例子中CONCAT()
的目的是欺騙ODBC認為列是“字符串類型”。沒有CONCAT()
,ODBC知道列是時間類型,而Excel不理解它。注意這是Excel的一個錯誤,因為它自動將一個字符串轉換為一個時間。如果數據源是一個文本文件,這問題將很大,但是當數據源是對每列報告準確類型的一個ODBC連接時,只是有點傻。
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);
在Windows95上,有3種可能性來指定伺服器名:
ip hostname
例如:
194.216.84.21 my
怎麼填寫“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
, Password
或Port
域指定值。然而如果你這樣做,當你試圖做一個連接時,這些值將在以後作為內定值使用,那時你有改變值的選擇。
如果沒給出端口號,使用內定端口(3306)。
如果你指定選項Read options from C:\my.cnf
,組client
和odbc
將從“C:\my.cnf”文件中讀出。你可以使用可用於mysql_options()
的所有選項。見20.4.37 mysql_options()
。
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;
如果你碰到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伺服器做完全一樣的事情。
記住,你能提供我們越多的資訊,我們越可能解決這個問題!