文档首页
MySQL Connector/ODBC 开发人员指南
相关文档 下载本手册
PDF (US Ltr) - 1.7Mb
PDF (A4) - 1.7Mb


MySQL Connector/ODBC 开发人员指南  /  Connector/ODBC 注意事项和技巧  /  Connector/ODBC 错误和解决方案 (常见问题解答)

8.4 Connector/ODBC 错误和解决方案 (常见问题解答)

以下部分详细介绍了一些常见错误及其建议的修复或替代解决方案。如果您仍然遇到问题,请使用 Connector/ODBC 邮件列表;请参阅 第 9.1 节,“Connector/ODBC 社区支持”.

许多问题可以通过将您的 Connector/ODBC 驱动程序升级到最新版本来解决。在 Windows 上,请确保您已安装最新版本的 Microsoft 数据访问组件 (MDAC)。

64 位 Windows 和 ODBC 数据源管理器

我在 Windows XP x64 版或 Windows Server 2003 R2 x64 上安装了 Connector/ODBC。安装成功完成,但 Connector/ODBC 驱动程序未出现在 ODBC 数据源管理器 中。

这不是错误,而是与 Windows x64 版操作系统与 ODBC 驱动程序的交互方式有关。在 Windows x64 版操作系统上,Connector/ODBC 驱动程序安装在 %SystemRoot%\SysWOW64 文件夹中。但是,Windows x64 版操作系统中通过 管理工具控制面板 提供的默认 ODBC 数据源管理器 位于 %SystemRoot%\system32 文件夹中,并且只搜索此文件夹以查找 ODBC 驱动程序。

在 Windows x64 版操作系统上,请使用位于 %SystemRoot%\SysWOW64\odbcad32.exe 的 ODBC 管理工具,这将正确找到已安装的 Connector/ODBC 驱动程序,并允许您创建 Connector/ODBC DSN。

此问题最初报告为错误 #20301。

错误 10061 (无法连接到服务器)

在连接或使用 测试 按钮 ODBC 数据源管理器 时,我收到错误 10061 (无法连接到服务器)。

此错误可能是由许多不同的问题引起的,包括服务器问题、网络问题以及防火墙和端口阻塞问题。有关更多信息,请参阅 无法连接到 [本地] MySQL 服务器.

"事务未启用" 错误

使用事务时,会报告以下错误:事务未启用

此错误表明您尝试对不支持事务的 MySQL 表使用 事务。使用 InnoDB 数据库引擎时,MySQL 中支持事务,这是 MySQL 5.5 及更高版本中的默认存储引擎。在 MySQL 5.1 之前的版本中,您也可以使用 BDB 引擎。

在继续之前,请检查以下内容

  • 验证您的 MySQL 服务器是否支持事务性数据库引擎。使用 SHOW ENGINES 获取可用引擎类型的列表。

  • 验证您正在更新的表是否使用事务性数据库引擎。

  • 确保您没有在 DSN 中启用 disable transactions 选项。

#DELETED# 记录由 Access 报告

Access 在链接表中插入或更新记录时,将记录报告为 #DELETED#

如果插入或更新的记录在 Access 中显示为 #DELETED#,那么

  • 如果您使用的是 Access 2000,请从 https://www.microsoft.com/en-in/download/details.aspx?id=21995 获取并安装最新的(版本 2.6 或更高版本)Microsoft MDAC (Microsoft 数据访问组件)。这修复了 Access 中的一个错误,即当您将数据导出到 MySQL 时,不会指定表名和列名。

    此外,请获取并应用 Microsoft Jet 4.0 Service Pack 5 (SP5),您可以在 http://support.microsoft.com/default.aspx?scid=kb;EN-US;q239114 中找到。这修复了在某些情况下 Access 中的列标记为 #DELETED# 的问题。

  • 对于所有版本的 Access,请启用 Connector/ODBC Return matching rows 选项。对于 Access 2.0,还请启用 Simulate ODBC 1.0 选项。

  • 在您希望能够更新的所有表中包含一个 TIMESTAMP

  • 在表中包含一个 主键。如果没有,新行或更新的行可能会显示为 #DELETED#

  • 只使用 DOUBLE 浮点字段。Access 在比较单精度浮点数时会失败。症状通常是新行或更新的行可能会显示为 #DELETED# 或您无法找到或更新行。

  • 如果您使用 Connector/ODBC 链接到包含 BIGINT 列的表,结果将显示为 #DELETED。解决方法是

    • 再添加一个带有 TIMESTAMP 作为数据类型的虚拟列。

    • 在 ODBC DSN 管理器中的连接对话框中选择 Change BIGINT columns to INT 选项。

    • 从 Access 中删除表链接并重新创建它。

    旧记录仍显示为 #DELETED#,但新添加/更新的记录会正确显示。

写入冲突或行位置错误

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

如果您看到以下错误,请在 DSN 配置对话框中选择 Return Matching Rows 选项,或指定 OPTION=2 作为连接参数

Write Conflict. Another user has changed your data.

Row cannot be located for updating. Some values may have been changed
since it was last read.

从 Access 97 导入

将数据从 Access 97 导出到 MySQL 会报告一个 语法错误

此错误特定于 Access 97 和早于 3.51.02 的 Connector/ODBC 版本。更新到最新版本的 Connector/ODBC 驱动程序以解决此问题。

从 Microsoft DTS 导入

将数据从 Microsoft DTS 导出到 MySQL 会报告一个 语法错误

此错误仅在使用 TEXTVARCHAR 数据类型的 MySQL 表中发生。您可以通过将您的 Connector/ODBC 驱动程序升级到 3.51.02 或更高版本来修复此错误。

来自 ODBC.NET 的 SQL_NO_DATA 异常

将 ODBC.NET 与 Connector/ODBC 一起使用时,在获取空字符串(长度为 0)时,它开始给出 SQL_NO_DATA 异常。

您可以从 http://support.microsoft.com/default.aspx?scid=kb;EN-US;q319243 获取解决此问题的补丁。

使用 SELECT COUNT(*) 时的错误

在 Visual Basic 和 ASP 中使用 SELECT COUNT(*) FROM tbl_name 会返回错误。

此错误发生是因为COUNT(*)表达式返回的是BIGINT类型,而ADO无法识别这么大的数字。选择“将BIGINT列更改为INT”选项(选项值16384)。

多步骤操作错误

使用AppendChunk()GetChunk() ADO方法时,会返回多步骤操作生成错误。检查每个状态值错误。

当游标位置指定为adUseServer时,ADO的GetChunk()AppendChunk()方法无法按预期工作。另一方面,您可以通过使用adUseClient来克服此错误。

可以在http://www.dwam.net/iishelp/ado/docs/adomth02_4.htm找到一个简单的示例。

修改记录错误

在编辑链接表上的记录时,Access会返回另一个用户修改了您修改的记录

在大多数情况下,可以通过以下方法解决此问题:

  • 如果表没有主键,则添加一个主键

  • 如果表没有时间戳列,则添加一个时间戳列。

  • 仅使用双精度浮点字段。某些程序在比较单精度浮点数时可能会失败。

如果这些策略不起作用,请先从ODBC管理器创建日志文件(从ODBCADMIN请求日志时获得的日志)和Connector/ODBC日志,以帮助您找出错误的原因。有关说明,请参见第 5.10 节,“获取ODBC跟踪文件”

Unix 或 Linux 上的直接应用程序链接

在Unix或Linux下将应用程序直接链接到Connector/ODBC库时,应用程序会崩溃。

Unix或Linux下的Connector/ODBC不支持直接应用程序链接。要连接到ODBC源,请使用驱动程序管理器,例如iODBCunixODBC

Microsoft Office 和 DATE 或 TIMESTAMP 列

Microsoft Office 套件中的应用程序无法更新包含DATETIMESTAMP列的表。

这是Connector/ODBC的一个已知问题。确保该字段具有默认值(而不是NULL),并且默认值不为零(即,不是0000-00-00 00:00:00)。

INFORMATION_SCHEMA 数据库

当将Connector/ODBC 5.x连接到MySQL 4.x服务器时,会返回错误1044 Access denied for user 'xxx'@'%' to database 'information_schema'

Connector/ODBC 5.x设计用于与MySQL 5.0或更高版本一起使用,利用INFORMATION_SCHEMA数据库来确定数据定义信息。计划在最终版本中支持MySQL 4.1。

S1T00 错误

调用SQLTables时,会返回错误S1T00,但我在Connector/ODBC的错误编号列表中找不到它。

S1T00错误表示ODBC系统内部发生了一般超时,而不是MySQL错误。它通常表示您使用的连接已失效,服务器太忙而无法接受您的请求,或者服务器已断开。

Access 2000 中的“表不存在”错误

在Access 2000中链接到表并以编程方式生成链接到表,而不是通过表设计器界面,您可能会收到有关表不存在的错误。

msjet40.dll的特定版本存在一个已知问题,该版本会显示此问题。受影响的版本为 4.0.9025.0。恢复到旧版本将使您能够创建链接。如果您最近更新了版本,请检查您的WINDOWS目录中是否有旧版本的该文件,并将该文件复制到驱动程序目录。

批处理语句

当我尝试使用批处理语句时,批处理语句的执行失败。

批处理语句支持是在 3.51.18 中添加的。默认情况下,批处理语句支持未启用。启用选项FLAG_MULTI_STATEMENTS,值为 67108864,或在 GUI 配置中选择“允许多个语句”标志。使用准备好的语句的批处理语句在 MySQL 中不受支持。

ADODB 和 Excel 的数据包错误

使用 ADODB 和 Excel 连接到 MySQL 服务器时,应用程序偶尔会无法与服务器通信,并且错误日志中会显示错误Got an error reading communication packets

此错误可能与 PanteraSoft.com 的 Keyboard Logger 1.1 相关,该软件已知会干扰 MySQL Connector/ODBC 和 MySQL 之间的网络通信。

外连接错误

使用某些应用程序通过 Connector/ODBC 和外连接访问 MySQL 服务器时,会报告有关外连接转义序列的错误。

这是 MySQL Connector/ODBC 的一个已知问题,它无法正确解析“外连接转义序列”,如 Microsoft ODBC 规范 中的规范。当前,Connector/ODBC 在被询问SQL_OJ_CAPABILITIES时会返回一个大于 0 的值,即使驱动程序没有进行解析来处理外连接转义序列。

希伯来语/CJK 字符

我可以用 Connector/ODBC 5.1 正确地将扩展字符(希伯来语/CJK)存储到数据库中,但是当我检索数据时,文本没有正确格式化,我得到了乱码。

使用 ASP 和 UTF8 字符时,将以下内容添加到您的 ASP 文件中,以确保返回的数据被正确编码:

Response.CodePage = 65001
Response.CharSet = "utf-8"

安装的程序列表中的重复项

在我的已安装程序列表中,有重复的 MySQL Connector/ODBC 条目,但我无法删除其中一个。

当您升级现有的 Connector/ODBC 安装而不是删除然后安装更新的版本时,可能会出现此问题。

警告

要解决此问题,请使用任何有效的卸载程序删除现有安装;然后可能需要编辑注册表内容。在尝试编辑注册表内容之前,请确保您已备份了注册表信息。

值被截断为 255 个字符

使用参数绑定提交带有UPDATE的查询时,我的字段值被截断为 255 个字符。

确保为您的连接设置了FLAG_BIG_PACKETS选项。这将删除绑定参数上的 255 个字符限制。

禁用数据在执行时

是否可以使用标志禁用数据在执行时?

如果您不想使用数据在执行时,请删除相应的调用。例如:

SQLLEN ylen = SQL_LEN_DATA_AT_EXEC(10);
SQLBindCol(hstmt,2,SQL_C_BINARY, buf, 10, &ylen);

将变成:

SQLBindCol(hstmt,2,SQL_C_BINARY, buf, 10, NULL);

此示例还将 SQLBindCol() 的调用中的 &ylen 替换为 NULL。

有关更多信息,请参阅MSDN 文档中有关 SQLBindCol() 的内容。

AUTO_INCREMENT 列的 NULLABLE 属性

当您对 AUTO_INCREMENT 的表列调用 SQLColumns() 时,结果集的 NULLABLE 列始终为 SQL_NULLABLE (1)

这是因为 MySQL 将此类列的 DEFAULT 值报告为 NULL。这意味着,如果您在该列中插入 NULL 值,您将获得该表 auto_increment 计数器的下一个整数值。