- 論壇徽章:
- 1
|
來(lái)源:
網(wǎng)海拾貝
MySQL利用MyODBC程序?yàn)镺DBC提供支持。
16.1 MyODBC支持的操作系統(tǒng)
MyODBC是在Windows95和Windows NT上的一個(gè)32位ODBC(2.50) level 0驅(qū)動(dòng)程序。我們希望誰(shuí)能將它移植到Windows 3.x。
16.2 怎樣報(bào)告MyODBC的問(wèn)題
MyODBC已經(jīng)用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。
如果你聽(tīng)說(shuō)有任何其他的應(yīng)用程序用MyODBC一起工作,請(qǐng)把它寄到
myodbc@lists.mysql.com
!
16.3 已知可用MyODBC工作的程序
大多數(shù)程序應(yīng)該可用MyODBC工作,但對(duì)下面列出的每一個(gè),我們自己測(cè)試了它或從它運(yùn)行的一些
用戶
得到了證實(shí):
程序
說(shuō)明
Access
為使Access工作:
- 你應(yīng)該在桌中有主鍵。
- 你應(yīng)該在所有你想要能被修改的表中有一個(gè)時(shí)間戳記。
- 僅使用雙精度浮點(diǎn)數(shù)的字段。當(dāng)用單精度浮點(diǎn)數(shù)進(jìn)行比較時(shí),Access失敗。
- 當(dāng)與MySQL連接時(shí),設(shè)置“Return matching rows”(返回匹配的行)選項(xiàng)域。
- 在NT上的Access將報(bào)告BLOB列為OLE OBJECTS。如果你想要有MEMO列,你應(yīng)該用ALTER TABLE把列改成TEXT。
- Access不能總是正確地處理DATE列。如果你對(duì)此有一個(gè)問(wèn)題,把列改為DATETIME。
- 在一些情況下,Access可以產(chǎn)生不合法的SQL查詢,而MySQL不能理解。你可以通過(guò)從Access菜單"Query|SQLSpecific|Pass-Through"來(lái)修正它。
DataJunction
你必須改變它來(lái)輸出VARCHAR而非ENUM,因?yàn)樗阅芤?strong>MySQL困惑的方式導(dǎo)出后者。
Execl
工作。一些建議:
- 如果你對(duì)日期有問(wèn)題,試著使用CONCAT()函數(shù)作為字符串選擇他們。例如:select CONCAT(rise_time), CONCAT(set_time)
from sunrise_sunset;
這種方式作為字符串檢索出的值應(yīng)該被Excel97識(shí)別為時(shí)間值,例子中CONCAT()的目的是欺騙ODBC認(rèn)為列是“字符串類型”。沒(méi)有CONCAT(),ODBC知道列是時(shí)間類型,而Excel不理解它。注意這是Excel的一個(gè)錯(cuò)誤,因?yàn)樗詣?dòng)將一個(gè)字符串
轉(zhuǎn)換
為一個(gè)時(shí)間。如果數(shù)據(jù)源是一個(gè)文本文件,這問(wèn)題將很大,但是當(dāng)數(shù)據(jù)源是對(duì)每列報(bào)告準(zhǔn)確類型的一個(gè)ODBC連接時(shí),只是有點(diǎn)傻。
odbcadmin
為ODBC的測(cè)試程序。
Delphi
你必須使用DBE 3.2或更新。當(dāng)與MySQL連接時(shí),設(shè)置“Don't optimize column width”(不優(yōu)化列寬度)選項(xiàng)域。另外,有一些潛在有用的delphi代碼安裝一個(gè)ODBC入口和針對(duì)MyODBC的一個(gè)BDE的入口(BDE入口需要一個(gè)BDE Alias Editor,可以到Delphi Super Page上免費(fèi)擁有):(
感謝
Bryan Brunton
bryan@flesherfab.com
)fReg:= TRegistry.Create;
fReg.OpenKey('SoftwareODBCODBC.INIDocumentsFab', True);
fReg.WriteString('Database', 'Documents');
fReg.WriteString('Description', ' ');
fReg.WriteString('Driver', 'C:WINNTSystem32myodbc.dll');
fReg.WriteString('Flag', '1');
fReg.WriteString('Password', '');
fReg.WriteString('Port', ' ');
fReg.WriteString('Server', 'xmark');
fReg.WriteString('User', 'winuser');
fReg.OpenKey('SoftwareODBCODBC.INIODBC 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測(cè)試過(guò)。唯一知道的問(wèn)題是,當(dāng)表框架改變時(shí),差詢字段不被更新。然而B(niǎo)DE似乎認(rèn)不出主鍵,只是索引PRIMARY,盡管這已經(jīng)不是個(gè)問(wèn)題。
Visual Basic
為了能更新一張表,你必須為表定義一個(gè)主鍵。
16.4 怎樣填寫ODBC管理程序的各種域
在Windows95上,有3種可能性來(lái)指定服務(wù)器名:
- 使用服務(wù)器的IP地址。
- 增加一個(gè)文件“l(fā)mhosts”,具有下列
信息
:ip hostname
例如:
194.216.84.21 my
- 設(shè)置PC以使用DNS。
怎么填寫“ODBC設(shè)置”的例子:
Windows DSN name: test
Description: This is my test database
MySql Database: test
Server: 194.216.84.21
User: monty
Password: my_password
Port:
對(duì)Windows DSN name域的值是在你的Windows ODBC設(shè)置中唯一的任何名字。
你不必為在ODBC設(shè)置屏的Server, User, Password或Port域指定值。然而如果你這樣做,當(dāng)你試圖做一個(gè)連接時(shí),這些值將在以后作為缺省值使用,那時(shí)你有改變值的選擇。
如果沒(méi)給出端口號(hào),使用缺省端口(3306)。
如果你指定選項(xiàng)Read options from C:my.cnf,組client和odbc將從“C:my.cnf”文件中讀出。你可以使用可用于mysql_options()的所有選項(xiàng)。見(jiàn)
20.4.37 mysql_options()
。
16.5 怎樣在ODBC中獲得一個(gè)AUTO_INCREMENT列的值
一個(gè)常見(jiàn)的問(wèn)題是怎樣得到一個(gè)自動(dòng)從一個(gè)INSERT產(chǎn)生的ID值,用ODBC,你可以這樣做(假定auto是一個(gè)AUTO_INCREMENT字段):
INSERT INTO foo (auto,text) VALUES(NULL,'text');
SELECT LAST_INSERT_ID();
或,如果你是只是想把ID插入到另外一個(gè)表中,你可以這樣做:
INSERT INTO foo (auto,text) VALUES(NULL,'text');
INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');
得益于一些ODBC應(yīng)用程序(至少Delphi和Access),下列查詢可被用來(lái)找出最新插入的行:
SELECT * FROM tbl_name WHERE auto IS NULL;
16.6 報(bào)告MyODBC的問(wèn)題
如果你碰到MyODBC困難,你應(yīng)該通過(guò)ODBC
管理
器制作一個(gè)日志文件(當(dāng)從ODBCADMIN要求日志時(shí),你獲得的日志文件)和一個(gè)MyODBC日志文件來(lái)開(kāi)始。為了獲得一個(gè)MyODBC日志文件,在MyODBC連接/配置屏幕上標(biāo)注“Trace MyODBC”選項(xiàng)
標(biāo)志
。日志文件將被寫入文件“C:myodbc.log”。注意為了此選項(xiàng)起作用,你必須使用MYSQL.DLL而不是MYSQL2.DLL!
檢查MyODBC發(fā)給MySQL服務(wù)器的查詢;你應(yīng)該可以通過(guò)在“myodbc.log”文件中尋找字符串>mysql_real_query找到它。
你也應(yīng)該試著在mysql監(jiān)視器或admndemo中重復(fù)查詢以找出是MyODBC出錯(cuò)還是MySQL出錯(cuò)。
如果你發(fā)現(xiàn)某些東西是錯(cuò)的,請(qǐng)值將相關(guān)的行(最大40排)發(fā)到
myodbc@lists.mysql.com
。請(qǐng)決不要發(fā)送整個(gè)MyODBC或ODBC日志文件!
如果你不能找出是什么錯(cuò)誤,最后的選擇制作一個(gè)檔案(tar或zip),包含一個(gè)MyODBC日志文件,ODBC日志文件和一個(gè)解釋這個(gè)問(wèn)題的 README文件。你可以把這發(fā)到
ftp://www.mysql.com/pub/mysql/secret
。至于在TCX的我們能訪問(wèn)你上載的文件并且我們將分離數(shù)據(jù)!
如果你能創(chuàng)造一個(gè)也顯示出這個(gè)問(wèn)題的程序,請(qǐng)也上載它!
如果程序與一些其他SQL服務(wù)器一起工作,你應(yīng)該制作一個(gè) ODBC 日志文件,在哪兒你在其他SQL服務(wù)器做完全一樣的事情。
記住,你能提供我們?cè)蕉嗟男畔,我們(cè)娇赡芙鉀Q這個(gè)問(wèn)題!
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/31/showart_688451.html |
|