第26章:连接器 / 26.1. MySQL Connector/ODBC / 26.1.11. MyODBC和Microsoft Access
26.1.11.1. 如何设置Microsoft Access,使之能够与使用MyODBC的MySQL一起工作?
26.1.11.2. 如何将表或查询从Access导出到MySQL?
26.1.11.3. 如何导入MySQL数据库表或将其链接到Access?
26.1.11.4. 链接表的结构或位置已改变,我能看到链接表中的这些变化吗?
26.1.11.5. 当我在链接表中插入记录或更新其中的记录时,遇到“#DELETED#”
26.1.11.6. 如何处理写冲突或行位置错误?
26.1.11.7. 无论何时,当我从Access 97导出表时,出现陌生的语法错误
26.1.11.8. 编辑记录时,Access返回“另一用户更改了你修改的记录”
26.1.11.9. 如何在Access中俘获ODBC登录错误消息?
26.1.11.10. 如何优化Access与MyODBC一起工作的性能?
26.1.11.11. 我有很长的表,MyODBC访问这些Access表的最佳配置是什么?
26.1.11.12. 如何为ODBC连接设置QueryTimeout值?
26.1.11.13. INFO:用于Access和MySQL间导入/导出的工具
在本节中,回答了与MyODBC和Microsoft Access有关的问题。

26.1.11.1. 如何设置Microsoft Access,使之能够与使用MyODBC的MySQL一起工作?

要想使Microsoft Access能够与MyODBC一起工作,在你的客户端PC上必须完成下述操作。

1.    如果你正在使用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或更高版本以解决该问题。

2.    安装最新版MySQL,http://dev.mysql.com/downloads/

3.    安装最新版MyODBC 3.51或2.50,http://dev.mysql.com/downloads/connector/odbc/

4.    对于所有版本的Access,应启用“MyODBC返回匹配行”选项。

5.    通过MyODBC,将Access用作MySQL服务器的前端程序。

26.1.11.2. 如何将表或查询从Access导出到MySQL?

除非已安装了MyODBC,否则不能将表或查询导出到MySQL。

要想将表从Access导入MySQL,请遵循下述说明:

1.    打开Access数据库或Access项目时,出现“数据库”窗口。其中显示了用于创建新数据库对象和打开已有对象的快捷方式。

Access Database

2.    点击打算导出的表名或查询名,然后在“文件”菜单中选择“导出”。

3.    在“导出对象类型对象名”对话框中,在“另存为类型”框中,选择ODBC数据库(),如下图所示

Selecting an ODBC Database

4.    在“导出”对话框中,输入文件名(或使用建议的文件名),然后选择OK。

5.    显示“选择数据源”对话框,其中列出了为计算机上已安装的各ODBC驱动定义的数据源。点击“文件数据源”或“机器数据源”选项卡,然后双击打算导出至的MyODBC或MyODBC 3.51数据源。关于为MyODBC定义新数据源的方法,请参见26.1.9.2节,“在Windows上配置MyODBC DSN”

Microsoft Access通过该数据源连接至MySQL服务器,并导出新的表和/或数据。

26.1.11.3. 如何导入MySQL数据库表或将其链接到Access?

除非已安装了MyODBC,否则不能将表或查询导出到MySQL数据库。

要想将表从MySQL导入或链接到Access,请采取下述步骤:

1.    打开数据库,或切换到“数据库”窗口以打开数据库。

2.    要想导入表,在“文件”菜单上,将鼠标指针指向“获取外部数据”,然后点击“导入”。要想链接表,在“文件”菜单上,将鼠标指针指向“获取外部数据”,然后点击“链接表”。

3.    在“导入”(或“链接”)对话框中,在“文件类型”框中选择“ODBC Databases ()”。在“选择数据源”对话框中,列出了定义的数据源。显示“选择数据源”对话框,其中列出了为安装在计算机上的任何ODBC驱动定义的数据源。点击“文件数据源”或“机器数据源”选项卡,然后双击打算导出至的MyODBC或MyODBC 3.51数据源。关于为MyODBC或MyODBC 3.51驱动定义新数据源的方法,请参见26.1.9.2节,“在Windows上配置MyODBC DSN”

4.    如果所选的数据源要求登录,请输入登录ID和密码(可能还需要额外信息),然后点击OK。

5.    Microsoft Access通过ODBC数据源连接到MySQL服务器,并显示可导入或链接的表清单。

6.    点击希望导入或链接的每个表,然后点击OK。如果你正在链接1个表,但它没有唯一识别各条记录的索引,Microsoft Access将显示链接表中的字段列表。点击能唯一标识各记录的字段或字段组合,然后点击OK。

26.1.11.4. 链接表的结构或位置已改变,我能看到链接表中的这些变化吗?

是。当链接表的结构或位置发生变化时,可采取下述步骤查看或刷新链接。“链接表管理器”列出了当前链接的所有表的路径。

要想查看或刷新链接:

1.    打开包含表链接的数据库。

2.    在“工具”菜单上,指向“加载项”(在Access 2000或更新版本中为“数据库实用工具”),然后点击“链接表管理器”。

3.    选中打算刷新链接的表的复选框。

4.    点击OK,刷新链接。

Microsoft Access将确认成功的刷新操作,或者,如果未找到表,将显示“选择<table name>新位置”对话框,在该对话框中,可指定表的新位置。如果你所选择的数个表已被移至你所指定的新位置,链接表管理器将针对所有所选的表搜索该位置,并一次性地更新所有链接。

要想更改链接表集合的路径:

1.    打开包含表链接的数据库。

2.    在“工具”菜单上,指向“加载项”(在Access 2000或更新版本中为“数据库实用工具”),然后点击“链接表管理器”。

3.    选中“对新位置始终提示”复选框。

4.    选中打算更改链接的表的复选框,然后点击OK。

5.    在“选择<table name>新位置”对话框中,指定新位置,点击“打开”,然后点击OK。

26.1.11.5. 当我在链接表中插入记录或更新其中的记录时,遇到“#DELETED#”

如果在Access中插入或更新的记录显示为“#DELETED#”:

·         如果你正在使用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或更高版本以解决该问题。

·         对于所有版本的Access,应启用“MyODBC返回匹配行”选项。对于Access 2.0,还应额外启用“模拟ODBC 1.0选项

·         在希望能够更新的所有表中,均应有时间戳。为了获得最大的可移植性,在列声明中不要使用长度规范。也就是说,应使用TIMESTAMP,而不是TIMESTAMP(n), n < 14。

·         在表中应有1个主键。如不然,新的或更新的行可能会显示为“#DELETED#”。

·         仅应使用DOUBLE浮点字段。与单精度浮点进行比较时,Access将失败。其征兆是新的或更新的行可能会显示为“#DELETED#”,或无法找到或更新行。

·         如果你正使用MyODBC来链接到有BIGINT列的表,结果会显示为“#DELETED”。排除它的解决方案是:

o        有1个以TIMESTAMP作为数据类型的虚拟列。

o        在“ODBC DSN管理器”的连接对话框中选择“将BIGINT列更改为INT”选项。

o        删除与Access的表链接,并重新创建它。

旧记录仍将显示为“#DELETED#”,但新增/更新的记录会恰当显示。

26.1.11.6. 如何处理写冲突或行位置错误?

如果看到下述错误,请在“DSN配置”对话框中选择“返回匹配行”选项,或将连接参数指定为“OPTION=2
写冲突。另一用户更改了你的数据。
 
无法找到需更新行的位置。自上次读取操作以来,某些值可能已被改变。

26.1.11.7. 无论何时,当我从Access 97导出表时,出现陌生的语法错误

对于Access 97,这是件奇怪的事宜,但在Access 2000或2002中并未出现。将MyODBC升级至MyODBC 3.51.02或以上,可以克服该问题。

26.1.11.8. 编辑记录时,Access返回“另一用户更改了你修改的记录”

对于某些程序,可能会出现该错误: 另一用户更改了你所修改的记录。在大多数情况下,可通过下述措施解决该问题:

·         如果主键不存在,为表添加1个主键。

·         如果时间戳不存在,添加1个时间戳列。

·         仅应使用DOUBLE浮点字段。与单精度浮点值比较时,某些程序会出错。

如果这些措施未能解决问题,首先应从ODBC管理器生成1个日志文件(请求来自ODBC ADMIN的日志时获得的日志文件),以及1个MyODBC日志,使用它们找出出错的原因。具体介绍,请参见26.1.9.7节,“获取ODBC跟踪文件”

26.1.11.9. 如何在Access中俘获ODBC登录错误消息?

请阅读“如何在Access中俘获ODBC登录错误消息”,http://support.microsoft.com/support/kb/articles/Q124/9/01.asp?LN=EN-US&SD=gn&FR=0%3CP%3E

26.1.11.10. 如何优化Access与MyODBC一起工作的性能?

·         优化客户端/服务器性能

·         关于转换应用程序以使用ODBCDirect的技巧

·         关于在所附的SQL表上优化查询的技巧

26.1.11.11. 我有很长的表,MyODBC访问这些Access表的最佳配置是什么?

如果在Access中有很大(长)的表,可能需要相当长的时间才能打开。或者,也可能是虚拟内存较低的情况下运行,最终导致ODBC查询失败错误,并无法打开表。为了解决该问题,可选择下述选项:

·         返回匹配行(2)

·         允许BIG结果(8)

这样可将值增加到10(OPTION=10)。

26.1.11.12. 如何为ODBC连接设置QueryTimeout值?

请参阅“为ODBC连接设置QueryTimeout值”,http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B153756

26.1.11.13. INFO:用于Access和MySQL间导入/导出的工具

关于可用工具列表,请参阅http://www.mysql.com/portal/software/convertors/一节。