以下部分详细介绍了一些常见错误及其建议的修复或替代解决方案。如果您仍然遇到问题,请使用 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 会报告一个 语法错误
。
此错误仅在使用 TEXT
或 VARCHAR
数据类型的 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源,请使用驱动程序管理器,例如iODBC
或unixODBC
。
Microsoft Office 和 DATE 或 TIMESTAMP 列
Microsoft Office 套件中的应用程序无法更新包含DATE
或TIMESTAMP
列的表。
这是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
计数器的下一个整数值。