大多数程序均能与MyODBC一起工作,对上面所列的每一程序,我们自己进行了测试,或得到用户的确认。很多介绍中均给出了你可能会遇到问题的描述。
· 程序
注释
· Access
要想使Access工作:
o 如果你正在使用Access 2000,应从下述地址获取并安装最新的(2.6版或更高)Microsoft MDAC(Microsoft数据访问组件),http://www.microsoft.com/data/。它更正了Access在将数据导出至MySQL时存在的一个缺陷,未指定表名和列名。另一种解决该缺陷的方法是,升级到MyODBC 2.50.33和MySQL 3.23.x, 它们共同提供了避免该问题的一种方式。
此外,你还应获取并应用Microsoft Jet 4.0 Service Pack 5 (SP5),可在下述地址找到它:http://support.microsoft.com/default.aspx?scid=kb;EN-US;q239114。它修正了某些情况下在Access中列被标注为“#DELETED#”的问题。
注释: 如果你正使用MySQL 3.22,必须安装MDAC补丁,并使用MyODBC 2.50.32或2.50.34或更高版本以解决该问题。
o 对于所有版本的Access,应启用“MyODBC返回匹配行”选项。对于Access 2.0,还应额外启用“模拟ODBC 1.0”选项。
o 在希望能够更新的所有表中,均应有时间戳。为了获得最大的可移植性,在列声明中不要使用长度规范。也就是说,应使用TIMESTAMP,而不是TIMESTAMP(n), n < 14。
o 在表中应有1个主键。如不然,新的或更新的行可能会显示为“#DELETED#”。
o 仅应使用DOUBLE浮点字段。与单精度浮点进行比较时,Access将失败。其征兆是新的或更新的行可能会显示为“#DELETED#”,或无法找到或更新行。
o 如果你正使用MyODBC来链接到有BIGINT列的表,结果会显示为“#DELETED”。排除它的解决方案是:
§ 有1个以TIMESTAMP作为数据类型的虚拟列。
§ 在“ODBC DSN管理器”的连接对话框中选择“将BIGINT列更改为INT”选项。
§ 删除与Access的表链接,并重新创建它。
旧记录仍将显示为“#DELETED#”,但新增/更新的记录会恰当显示。
o 添加了TIMESTAMP列后,另一位用户更改了数据,如果错误依旧出现,下述技巧或许有所帮助:
不要使用表数据表视图。取而代之的是,从你希望使用的表创建一个表单,并使用表单数据表视图。应将TIMESTAM列的DefaultValue属性设置为NOW()。在视图中隐藏TIMESTAMP列或许是个好主意,这样就不会使你的用户感到迷惑。
o 在某些情况下,Access可能会生成MySQL无法理解的SQL语句。可通过在Access菜单中选择“Query|SQLSpecific|Pass-Through”来更正该问题。
o 在NT平台上,Access会将BLOB列通报为OLE OBJECTS(OLE对象)。如果你打算用MEMO列取而代之,应使用ALTER TABLE将BLOB列更改为TEXT。
o Access无法在任何时候均恰当处理DATE列。如果遇到这类问题,请将列更改为DATETIME。
o 如果在Access中存在定义为BYTE的列,Access会视图将其导出为TINYINT而不是TINYINT UNSIGNED。如果列中的值大于127,将出现问题。
· ADO
使用ADO API和MyODBC进行编码时,需要注意某些不被MySQL服务器支持的默认属性。例如,对于RecordCount属性,如果将CursorLocation属性用作adUseServer,将返回结果“-1”。要想获得正确的值,需要将该属性设置为adUseClient,如下面给出的VB代码示例所示:
Dim myconn As New ADODB.Connection Dim myrs As New Recordset Dim mySQL As String Dim myrows As Long myconn.Open "DSN=MyODBCsample" mySQL = "SELECT * from user" myrs.Source = mySQL Set myrs.ActiveConnection = myconn myrs.CursorLocation = adUseClient myrs.Open myrows = myrs.RecordCount myrs.Close myconn.Close
另一种处理方式是,对类似查询使用SELECT COUNT(*)语句以获取正确的行计数。
· 主动服务器页(ASP)
应选择“返回匹配行”选项。
· BDE应用程序
要想使这类应用程序工作,应选择“不优化列宽度并返回匹配行”选项。
· Borland Builder 4
开始查询时,可使用Active属性或Open方法。注意,Active将通过自动发出“SELECT * FROM ...”查询开始。如果表很大,这不是什么好事。
· ColdFusion(在Unix平台上)
下述信息取自ColdFusion文档:
使用下述信息来配置用于Linux的ColdFusion服务器,以便使用针对MySQL数据源的unixODBC驱动和MyODBC。Allaire已证明,MyODBC 2.50.26能够与MySQL 3.22.27以及用于Linux的ColdFusion一起工作。(任何较新的版本也应能正确工作)。你可以在网站http://dev.mysql.com/downloads/connector/odbc/上下载MyODBC。
通过ColdFusion 4.5.1版,可以使用“ColdFusion管理器”来添加MySQL数据源。但是,驱动程序未包含在ColdFusion 4.5.1版中。在MySQL驱动程序出现在ODBC数据源下拉列表之前,必须创建MyODBC驱动程序,并将其拷贝到/opt/coldfusion/lib/libmyodbc.so。
在Contrib目录下包含程序mydsn-xxx.zip,使用它,对于Coldfusion应用程序,可创建并删除用于MyODBC驱动的DSN注册文件。
· DataJunction
应对其进行更改,使之输出VARCHAR而不是ENUM,因为其导出ENUM的方式会造成MySQL问题。
· Excel
工作。一些提示:
o 如果遇到日期方面的问题,请使用CONCAT()函数,将其选择为字符串。例如:
o SELECT CONCAT(rise_time), CONCAT(set_time) o FROM sunrise_sunset;
采用该方式以字符串提取的值应能被Excel97正确识别为时间值。
在本例中,CONCAT()的目的是让ODBC认为列是“字符串类型”。如果没有CONCAT(),ODBC会将列视为时间类型,Excel无法理解它。
注意,Excel存在1个缺陷,这是因为它会自动将字符串转换为时间。如果源是文本文件,不存在问题,但当源是通报各列准确类型的ODBC连接时,将出现问题。
· Word
要想将数据从MySQL提取到Word/Excel文档,需要使用MyODBC驱动程序以及“Microsoft查询帮助”插件。
例如,用含有两列文本的表创建1个数据库:
o 使用mysql客户端命令行工具插入行。
o 使用ODBC管理器创建1个DSN文件,例如,针对刚创建数据库的“my”。
o 打开Word应用程序。
o 创建1个新的空白文档。
o 在数据库工具栏上,按“插入数据库”按钮。
o 按“获取数据”按钮。
o 在“获取数据”屏幕右侧,按“Ms Query”按钮。
o 在“Ms Query”中使用“my DSN”文件创建1个新数据源。
o 选择新查询。
o 选择打算使用的列。
o 如果愿意,创建1个过滤器。
o 如果愿意,创建1个分类。
o 选择“将数据返回到Microsoft Word”。
o 点击“完成”。
o 点击“插入数据”并选择记录。
o 点击OK,在你的Word文档中将看到插入的行。
· odbcadmin
ODBC的测试程序。
· Delphi
必须使用BDE 3.2版或更新的版本。连接到MySQL时,选择“不优化列宽度”选项。
此外,这里给出了一些可能有用的Delphi代码,这些代码可设置为MyODBC设置ODBC条目和BDE条目。BDE条目要求用到“BDE别名编辑器”,它位于靠近你的“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的索引,尽管这谈不上是问题。
· Vision
应选择“返回匹配行”选项。
· Visual Basic
要想更新表,必须为表定义主键。
带有ADO的Visual Basic不能处理大整数。这意味着某些查询(如SHOW PROCESSLIST等)不会正确工作。更正方法是,在ODBC连接字符串中使用OPTION=16384,或在MyODBC连接屏幕上选择“将BIGINT列更改为INT”选项。或许,你也希望选择“返回匹配行”选项。
· VisualInterDev
如果在结果中有BIGINT,可能会出现错误“[Microsoft][ODBC Driver Manager]驱动程序不支持该参数”。请在MyODBC连接屏幕上选择“将BIGINT列更改为INT”选项。
· Visual Objects
应选择“不优化列宽度”选项。
· MS Visio Enterprise 2000
通过MyODBC(2.50.37或更高版本),通过连接MS Vision Enterprise 2000和MySQL,并使用Visio的逆向工程师功能,我们建立了数据库模型,使用它来检索关于DB的信息(Visio显示了所有的列定义、主键、索引等)。此外,我们还通过指定Visio中的新表进行了测试,并通过MyODBC将其导出至MySQL。