MySQL 连接器/ODBC 开发人员指南  / 第 8 章连接器/ODBC 注释和提示  /  8.4 连接器/ODBC 错误和解决方案(FAQ)

8.4 连接器/ODBC 错误和解决方案(FAQ)

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

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

64 位 Windows 和 ODBC 数据源管理器

我在 Windows XP x64 Edition 或 Windows Server 2003 R2 x64 上安装了连接器/ODBC。安装成功完成,但连接器/ODBC 驱动程序未出现在ODBC Data Source Administrator.

这不是错误,而是与 Windows x64 版本使用 ODBC 驱动程序的方式有关。在 Windows x64 版本上,连接器/ODBC 驱动程序安装在该 %SystemRoot%\SysWOW64文件夹中。但是,通过 Windows x64 版本或在 Windows x64 版本ODBC Data Source Administrator中可用的默认设置位于该 文件夹中,并且仅在该文件夹中搜索 ODBC 驱动程序。 Administrative ToolsControl Panel%SystemRoot%\system32

在 Windows x64 版本上,使用位于 的 ODBC 管理工具 %SystemRoot%\SysWOW64\odbcad32.exe,这将正确定位已安装的连接器/ODBC 驱动程序并使您能够创建连接器/ODBC DSN。

此问题最初被报告为 Bug #20301。

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

连接或使用测试按钮时ODBC Data Source Administrator出现错误 10061(无法连接到服务器)

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

“交易未启用”错误

使用事务报如下错误: Transactions are not enabled

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

在继续之前检查以下内容:

  • 确认您的 MySQL 服务器支持事务数据库引擎。用于SHOW ENGINES获取可用引擎类型的列表。

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

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

#DELETED# Access 报告的记录

#DELETED#在链接表中插入或更新记录时 访问报告记录。

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

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

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

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

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

  • 在表中包含一个主键。否则,新的或更新的行可能显示为#DELETED#

  • 仅使用DOUBLE浮动字段。与单精度浮点数比较时访问失败。症状通常是新的或更新的行可能显示为,#DELETED#或者您无法找到或更新行。

  • 如果您使用连接器/ODBC 链接到具有 BIGINT列的表,则结果显示为#DELETED. 解决方案的工作是:

    • 有一个虚拟列 TIMESTAMP作为数据类型。

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

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

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

写入冲突或行位置错误

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

如果您看到以下错误,请Return Matching Rows在 DSN 配置对话框中选择该选项,或指定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 会报告一个Syntax Error.

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

从 Microsoft DTS 导入

将数据从 Microsoft DTS 导出到 MySQL 会报告一个 Syntax Error.

只有使用 TEXTVARCHAR数据类型的 MySQL 表才会出现此错误。您可以通过将连接器/ODBC 驱动程序升级到版本 3.51.02 或更高版本来修复此错误。

来自 ODBC.NET 的 SQL_NO_DATA 异常

将 ODBC.NET 与连接器/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 无法理解这么大的数字。选择Change BIGINT columns to INT选项(选项值 16384)。

多步操作错误

使用AppendChunk()GetChunk()ADO 方法, Multiple-step operation generated errors. Check each status value返回错误。

当游标位置指定为 时,ADO 中的GetChunk()AppendChunk()方法无法按预期工作 adUseServer。另一方面,您可以使用adUseClient.

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

修改记录错误

Another user had modified the record that you have modified在链接表上编辑记录时 访问返回。

在大多数情况下,这可以通过执行以下操作之一来解决:

  • 如果表不存在,则为表 添加一个主键。

  • 如果时间戳列不存在,则添加一个时间戳列。

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

如果这些策略没有帮助,首先从 ODBC 管理器创建一个日志文件(从 ODBCADMIN 请求日志时获得的日志)和一个连接器/ODBC 日志,以帮助您找出出错的原因。有关说明,请参阅 第 5.9 节 “获取 ODBC 跟踪文件”

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

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

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

Microsoft Office 和 DATE 或 TIMESTAMP 列

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

这是连接器/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 的键盘记录器 1.1 有关,已知它会干扰 MySQL Connector/ODBC 和 MySQL 之间的网络通信。

外连接错误

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

这是 MySQL Connector/ODBC 的一个已知问题,它没有根据 Microsoft ODBC Specs的规范正确解析“外部连接转义序列” 。目前,Connector/ODBC 将在请求时返回一个 > 0 的值,SQL_OJ_CAPABILITIES即使在驱动程序中没有进行解析来处理外部连接转义序列。

希伯来语/CJK 字符

我可以使用连接器/ODBC 5.1 在数据库 (Hebrew/CJK) 中正确存储扩展字符,但是当我检索数据时,文本格式不正确并且出现乱码。

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

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

已安装程序列表中的重复条目

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

当您升级现有的连接器/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);

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

有关详细信息, 请 参阅.SQLBindCol()

AUTO_INCREMENT 列的 NULLABLE 属性

当您调用SQLColumns()一个表列时,结果集AUTO_INCREMENTNULLABLE列总是 SQL_NULLABLE (1).

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