目录
当前位置: 首页 > 文档资料 > MySQL 中文手册 >

26.1. MySQL Connector/ODBC

优质
小牛编辑
130浏览
2023-12-01
26.1.1. MyODBC介绍
26.1.2. 关于ODBC和MyODBC的一般信息
26.1.3. 如何安装MyODBC
26.1.4. 在Windows平台上从二进制版本安装MyODBC
26.1.5. I在Unix平台上从二进制版本安装MyODBC
26.1.6. 在Windows平台上从源码版本安装MyODBC
26.1.7. 在Unix平台上从源码版本安装MyODBC
26.1.8. 从BitKeeper开发源码树安装MyODBC
26.1.9. MyODBC配置
26.1.10. 与MyODBC连接相关的事宜
26.1.11. MyODBC和Microsoft Access
26.1.12. MyODBC和Microsoft VBA及ASP
26.1.13. MyODBC和第三方ODBC工具
26.1.14. MyODBC通用功能
26.1.15. 基本的MyODBC应用步骤
26.1.16. MyODBC API引用
26.1.17. MyODBC数据类型
26.1.18. MyODBC错误代码
26.1.19. MyODBC与VB:ADO、DAO和RDO
26.1.20. MyODBC与Microsoft.NET
26.1.21. 感谢

通过MySQL Connector/ODBC(MyODBC驱动程序系列),MySQL为ODBC提供了支持。这是针对MyODBC驱动程序中Connector/ODBC产品系列的参考,它提供了对MySQL数据库系统的ODBC 3.5x兼容访问。介绍了安装MyODBC和使用MyODBC的方式。此外,在本章中还介绍了能够与MyODBC一起工作的公用程序信息,并回答了一些关于MyODBC的常见问题。

本参考适用于MyODBC 3.51。对于相应的版本,你可以找到旧的二进制版或源码版MyODBC手册。

这是关于MySQL ODBC驱动程序的参考手册,而不是通用ODBC参考。关于ODBC的更多信息,请参阅http://www.microsoft.com/data/。

对于本参考的应用程序开发部分,假定用户在C语言方面有着良好的实践知识,对DBMS有一般了解,最后,还应熟悉MySQL。关于MySQL功能及其语法的更多信息,请参阅http://dev.mysql.com/doc/。

如果你的问题未能在本文档中得到解答,请发送电子邮件至myodbc@lists.mysql.com。

26.1.1. MyODBC介绍

26.1.1.1. 什么是ODBC?
26.1.1.2. 什么是Connector/ODBC?
26.1.1.3. 什么是MyODBC 2.50?
26.1.1.4. 什么是MyODBC 2.50?
26.1.1.5. 从哪获取MyODBC
26.1.1.6. 支持的平台
26.1.1.7. MyODBC邮件列表
26.1.1.8. MyODBC论坛
26.1.1.9. 如何通报MyODBC问题或缺陷
26.1.1.10. 如何提交MyODBC补丁

26.1.1.1. 什么是ODBC?

ODBC(开放式数据库连接性)为客户端程序提供了访问众多数据库或数据源的一种方式。ODBC是标准化的API,允许与SQL数据库服务器进行连接。它是根据SQL Access Group的规范开发的,它定义了一套函数调用、错误代码和数据类型,可将其用于开发独立于数据库的应用程序。通常情况下,当需要数据库独立或需要同时访问不同的数据源时,将用到ODBC。

关于ODBC的更多信息,请参阅 http://www.microsoft.com/data/。

26.1.1.2. 什么是Connector/ODBC?

Connector/ODBC是描述MySQL ODBC驱动程序MySQL AB产品系列的名称。它们也称为MyODBC驱动程序。

26.1.1.3. 什么是MyODBC 2.50?

MyODBC 2.50是MySQL AB的32位ODBC驱动程序,它基于ODBC 2.50规范层次0(具有层次1和层次2的特性)。这是开放源码市场最流行的ODBC驱动程序之一,很多用户都使用它来访问MySQL提供的功能。

26.1.1.4. 什么是MyODBC 2.50?

MyODBC 3.51是一种32位ODBC驱动程序,也称为MySQL ODBC 3.51驱动程序。与已有的MyODBC 2.50驱动程序相比,该版本有所增强。它支持ODBC 3.5x规范层次1(全部核心API +层次2特性),以便能够为访问MySQL提供所有的ODBC功能。

26.1.1.5. 从哪获取MyODBC

MySQL AB依GPL(通用公共许可)发布其所有产品。你可以从MySQL AB的网站获取最新的MyODBC二进制版和源码版:http://dev.mysql.com/downloads/。

关于MyODBC的更多信息,请访问http://www.mysql.com/products/myodbc/。

关于许可的更多信息,请访问http://www.mysql.com/company/legal/licensing/。

26.1.1.6. 支持的平台

MyODBC可用于MySQL支持的所有主要平台,如:

·Windows 95, 98, Me, NT, 2000, XP和2003

·所有Unix操作系统

o AIX

o Amiga

o BSDI

o DEC

o FreeBSD

o HP-UX 10, 11

o Linux

o Mac OS X Server

o Mac OS X

o NetBSD

o OpenBSD

o OS/2

o SGI Irix

o Solaris

o SunOS

o SCO OpenServer

o SCO UnixWare

o Tru64 Unix

对于特定平台,如果无法下载二进制版本,可通过下载驱动程序源码自行创建驱动程序。你也可以为MySQL贡献二进制代码,方式是发送邮件至myodbc@lists.mysql.com,这样其他用户就能使用你贡献的内容。

26.1.1.7. MyODBC邮件列表

MySQL AB通过其邮件列表为用户社区提供帮助。对于与MyODBC有关的事宜,可使用myodbc@lists.mysql.com邮件列表,从有经验的用户处获得帮助。

关于订阅MySQL邮件列表或浏览列表档案的更多信息,请访问http://lists.mysql.com/。

其中,关注程度最高的是论坛MySQL连接器部分的ODBC论坛。

26.1.1.8. MyODBC论坛

通过MySQL论坛(位于http://forums.mysql.com),可获得有经验用户的支持和帮助。

26.1.1.9. 如何通报MyODBC问题或缺陷

如果遇到与MyODBC有关的困难或问题,首先应使用ODBC管理器和MyODBC生成一份日志文件(请求来自ODBC ADMIN的日志时获得的日志文件)。关于完成该步骤的方式,请参见26.1.9.7节,“获取ODBC跟踪文件”。

检查MyODBC跟踪文件,找出可能出错的地方。通过在myodbc.log文件中搜索字符串“>mysql_real_query”,可确定已执行的语句。

此外,你还应尝试从mysql客户端程序或admndemo执行语句。这样,就能帮助你确定错误的出处,MyODBC或MySQL。

如果你发现了不正确的事项,请将相关行(最多40行)发送给MyODBC邮件列表。请参见1.7.1.1节,“MySQL邮件列表”。请勿发送整个MyODBC或ODBC日志文件!

如果你无法找出错误之所在,最后的选择是,以tar或zip格式创建包含MyODBC跟踪文件、ODBC日志文件和README文件(阐明问题)的档案。你可以将该档案文件发送至ftp://ftp.mysql.com/pub/mysql/upload/。只有位于MySQL AB的我们才能访问你上传的文件,而且我们会十分谨慎地对待这类数据。

如果你创建了仍出现问题的程序,请将该程序也包含在档案文件中。

如果程序能够与某些其他SQL服务器一起工作,档案中还应包含在这类其他SQL服务器下工作的ODBC日志文件。

请记住,你提供给我们的信息越多,我们更正问题的机会就越大。

26.1.1.10. 如何提交MyODBC补丁

你可以通过电子邮件,就已有代码或问题发送补丁或提出更好的解决方案:myodbc@lists.mysql.com。

26.1.2. 关于ODBC和MyODBC的一般信息

26.1.2.1. ODBC介绍
26.1.2.2. MyODBC体系结构
26.1.2.3. ODBC驱动管理器
26.1.2.4. MySQL ODBC驱动程序的类型

26.1.2.1. ODBC介绍

开放式数据库连接性(ODBC)是广泛接受的用于数据库访问的应用程序编程接口(API)。它基于针对数据库API的CLI(调用层接口)规范(来自X/Open和ISO/IEC),并采用了结构化查询语言(SQL)作为其数据库访问语言。

在26.1.16节,“MyODBC API引用”中,概要介绍了MyODBC支持的ODBC功能。关于ODBC的更多信息,请参阅http://www.microsoft.com/data/。

26.1.2.2. MyODBC体系结构

MyODBC体系结构建立在5个组件上,如下图所示:

MyODBC Architecture

·应用程序:

应用程序指的是通过调用ODBC API来访问MySQL服务器上数据的程序。应用程序使用标准的ODBC调用与驱动管理器进行通信。应用程序不关心数据的存储位置,存储方式,甚至不关心为访问数据而进行的系统配置方式。它仅需要知道数据源名(DSN)。

对于所有的应用程序,无论它们使用OBDC的方式是什么,很多任务是共同的。这些任务包括:

o 选择MySQL服务器,并与之连接。

o 提交将要执行的SQL语句。

o 检索结果(如果有的话)。

o 处理错误。

o 提交或回滚包含SQL语句的事务。

o 断开与MySQL服务器的连接。

由于大多数数据访问工作是使用SQL完成,对于使用OBDC的应用程序来说,其主要任务是提交SQL语句,并检索由这些语句生成的结果。

·驱动管理器:

驱动管理器是用于管理应用程序和驱动程序间通信的库。它负责执行下述任务:

o 解析数据源名(DSN)。

o 加载和卸载驱动程序。

o 处理ODBC调用,或将其传递给驱动程序。

·MyODBC驱动程序:

MyODBC驱动程序是用于实施ODBC API所提供功能的库。它负责处理ODBC函数调用,将SQL请求提交给MySQL服务器,并将结果返回给应用程序。如有必要,驱动程序会更改应用程序的请求,以便该请求符合MySQL支持的语法。

·ODBC.INI:

ODBC.INI是ODBC配置文件,其中保存了连接到服务器所需的驱动信息和数据库信息。驱动管理器将使用它来确定加载哪个驱动程序(使用数据源名)。驱动程序将根据指定的DSN使用它来读取连接参数。更多信息,请参见26.1.9节,“MyODBC配置”。

·MySQL服务器:

MySQL服务器是数据源。MySQL是:

o 一种数据库管理系统(DBMS)

o 一种关联数据库管理系统(RDBMS)

o 开放源码软件

26.1.2.3. ODBC驱动管理器

ODBC驱动管理器是用于管理ODBC应用程序和驱动程序间通信的库。其主要功能包括:

·解析数据源名(DSN)。

·加载和卸载驱动程序。

·处理ODBC函数调用,或将其传递给驱动程序。

下面给出了一些常用的驱动程序:

·Microsoft Windows ODBC驱动管理器(odbc32.dll),http://www.microsoft.com/data/

·unixODBC Unix驱动管理器(libodbc.so),http://www.unixodbc.org。

·iODBC ODBC Unix驱动管理器(libiodbc.so),http://www.iodbc.org。

从2.1.2版开始,UnixODBC也提供MyODBC 3.51。

26.1.2.4. MySQL ODBC驱动程序的类型

MySQL AB支持两种通过ODBC API访问MySQL功能的开放源码ODBC驱动程序: MyODBC (MyODBC 2.50)和MySQL ODBC 3.51驱动(MyODBC 3.51)。

注释: 从本节起,我们将这两类驱动程序统称为MyODBC。但当存在差异时,我们将使用它们的本名。

26.1.3. 如何安装MyODBC

MyODBC能够工作在Windows 9x, Me, NT, 2000, XP和2003,以及大多数Unix平台上。

MyODBC是开放源码软件。你可以在网站http://dev.mysql.com/downloads/connector/odbc/上找到它的最新版本。请注意,2.50.x版采用的是LGPL许可,而3.51.x版采用的是GPL许可。

如果使用MyODBC时出现了问题,而且你的程序还能与OLEDB一起工作,应尝试使用OLEDB驱动程序。

正常情况下,在Windows机器上仅需安装MyODBC。仅当你拥有运行在Unix机器上的程序(如ColdFusion),而且该程序将使用ODBC来访问数据库时,才需安装用于Unix的MyODBC。

如果你打算在Unix机器上安装MyODBC,还需要1个ODBC管理器。MyODBC能够与大多数Unix ODBC管理器一起工作。

·要想使用ODBC应用程序(不支持MySQL的应用程序),建立从Windows平台到Unix平台的连接,首先必须在Windows机器上安装MyODBC。

·用户和Windows机器必须具有访问位于Unix机器上的MySQL服务器的权限。这可通过GRANT命令设置。请参见13.5.1.3节,“GRANT和REVOKE语法”。

·必须创建ODBC DSN条目,方式如下:

1. 打开Windows机器上的控制面板。

2. 双击ODBC数据源32位图标。

3. 点击选项卡“用户DSN”。

4. 点击“添加”按钮。

5. 在“创建新数据源”屏幕上选择MySQL,并点击“完成”按钮。

6. 显示MySQL驱动程序的默认配置屏幕。请参见26.1.9.2节,“在Windows上配置MyODBC DSN”。

·启动应用程序,并使用在ODBC管理器中指定的DSN选择ODBC驱动程序。

注意,在MySQL屏幕上还显示了其他选项,如果遇到问题,可尝试这些选项(如跟踪、连接时不提示等)。

26.1.4. 在Windows平台上从二进制版本安装MyODBC

要想在Windows平台上安装MyODBC,应从下述站点下载恰当的分发文件,http://dev.mysql.com/downloads/connector/odbc/,解压该文件,并执行MyODBC-VERSION.exe文件。

在Windows平台上,安装较旧的MyODBC 2.50驱动时,可能会遇到下述错误:

拷贝C:\WINDOWS\SYSTEM\MFC30.DLL时出现错误。

重启Windows,并再次安装(在运行任何使用ODBC的应用程序之前)。

问题在于其他程序正使用ODBC。由于Windows的设计方式,在这种情况下,你可能无法使用Microsoft的ODBC设置程序安装新的ODBC驱动。在大多数情况下,可以通过连续按“忽略”键拷贝剩余的MyODBC文件,最终安装应仍能工作。如不然,解决方案是在“安全模式”下重新启动计算机。在重启的过程中,在机器启动Windows前按F8,选择“安全模式”,安装MyODBC,然后在正常模式下重新启动计算机。

26.1.5. I在Unix平台上从二进制版本安装MyODBC

26.1.5.1. 从RPM分发版安装MyODBC
26.1.5.2. 从二进制Tarball分发版安装MyODBC

26.1.5.1. 从RPM分发版安装MyODBC

要想使用RPM分发版在Linux平台上安装或升级MyODBC,可简单地下载最新MyODBC的RPM分发版,并按照下面介绍的方式操作。使用su root成为根用户,然后安装RPM文件。

如果是首次安装:

shell> su root
shell> rpm -ivh MyODBC-3.51.01.i386-1.rpm

如果驱动程序已存在,可按照下述方式升级它:

shell> su root
shell> rpm -Uvh MyODBC-3.51.01.i386-1.rpm

如果存在关于MySQL客户端库libmysqlclient的任何依存错误,可使用“-nodeps”选项简单地忽略它,然后确保MySQL客户端共享库位于路径中或通过LD_LIBRARY_PATH进行了设置。

这样,就会将驱动程序库和相关文件分别安装到/usr/local/lib和/usr/share/doc/MyODBC目录下。请转至26.1.9.3节,“在Unix平台上配置MyODBC DSN”。

要想卸载驱动程序,请首先成为根用户,然后执行rpm命令:

shell> su root
shell> rpm -e MyODBC

26.1.5.2. 从二进制Tarball分发版安装MyODBC

要想从tarball分发版(.tar.gz文件)安装驱动程序,请下载针对你所使用操作系统的最新版驱动程序,然后按照下述步骤操作:

shell> su root
shell> gunzip MyODBC-3.51.01-i686-pc-linux.tar.gz
shell> tar xvf MyODBC-3.51.01-i686-pc-linux.tar
shell> cd MyODBC-3.51.01-i686-pc-linux

请阅读INSTALL-BINARY文件中的安装说明,并执行下述命令:

shell> cp libmyodbc* /usr/local/lib
shell> cp odbc.ini /usr/local/etc
shell> export ODBCINI=/usr/local/etc/odbc.ini

然后,请跳至26.1.9.3节,“在Unix平台上配置MyODBC DSN”为MyODBC配置DSN。更多信息,请参见与发布版一起提供的INSTALL-BINARY文件。

26.1.6. 在Windows平台上从源码版本安装MyODBC

26.1.6.1. 要求
26.1.6.2. 构建MyODBC 3.51
26.1.6.3. 测试
26.1.6.4. 构建MyODBC 2.50

26.1.6.1. 要求

·MDAC, Microsoft Data Access SDK:http://www.microsoft.com/data/。

·MySQL客户端库以及MySQL 4.0.0或更高版本的包含文件。(最好是MySQL 4.0.16或更高版本)。应满足上述要求,这是因为MyODBC需要用到该版本以上的库才提供的新调用和结构。要想获得客户端库和包含文件,请访问http://dev.mysql.com/downloads/。

26.1.6.2. 构建MyODBC 3.51

MyODBC 3.51源码分发版包括使用nmake的Makefiles。在分发版中,你可以找到用于创建发布版的Makefile,以及用于创建驱动库和DLL调试版的Makefile_debug。

要想创建驱动程序,请采取下述步骤:

1. 下载并将源码展开到文件夹,然后将位置切换到该文件夹。在下述命令中,假定文件夹为myodbc3-src:

2.   C:\> cd myodbc3-src

3. 编辑Makefile,为MySQL客户端库和头文件指定正确的路径。然后使用下述命令创建并安装发布版。

4.   C:\> nmake -f Makefile
5.   C:\> nmake -f Makefile install

nmake -f Makefile用于创建驱动程序的发布版并将二进制码放入名为Release的子目录下。

nmake -f Makefile install用于将驱动程序DLL和库(myodbc3.dll,myodbc3.lib)安装(拷贝)到系统目录下。

6. 要想创建调试版,请使用Makefile_Debug而不是Makefile,如下所示:

7.   C:\> nmake -f Makefile_debug
8.   C:\> nmake -f Makefile_debug install

9. 使用下述命令,可清除并重新创建驱动程序:

10.       C:\> nmake -f Makefile clean
11.       C:\> nmake -f Makefile install

注释:

·确保在Makefiles中指定了正确的MySQL客户端库和头文件路径(设置MYSQL_LIB_PATH和MYSQL_INCLUDE_PATH变量)。默认的头文件路径是C:\mysql\include。对于发布版DLL,默认的库路径是C:\mysql\lib\opt,对于调试版,默认路径是C:\mysql\lib\debug。

·关于nmake的完整用法,请参见http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vcce4/html/evgrfRunningNMAKE.asp。

·如果你正在使用BitKeeper树来进行编译,所有的针对Windows的Makefiles均将被命名为Win_Makefile*。

26.1.6.3. 测试

将驱动程序库拷贝/安装到系统目录后,可使用示例子目录下提供的示例测试这些库是否已正确创建:

C:\> cd samples
C:\> nmake -f Makefile all

26.1.6.4. 构建MyODBC 2.50

MyODBC 2.50源码分发版包含VC工作空间文件。通过在Microsoft Visual Studio 6.0中加载这些文件(.dsp和.dsw),可使用它们直接创建驱动程序。

26.1.7. 在Unix平台上从源码版本安装MyODBC

26.1.7.1. 要求
26.1.7.2. 典型配置选项
26.1.7.3. 线程安全客户端
26.1.7.4. 共享或静态选项
26.1.7.5. 启用调试信息
26.1.7.6. 允许文档功能
26.1.7.7. 创建和编译
26.1.7.8. 创建共享库
26.1.7.9. 安装驱动库
26.1.7.10. 在Unix平台上测试MyODBC
26.1.7.11. Mac OS X注意事项
26.1.7.12. HP-UX注意事项
26.1.7.13. AIX注意事项

26.1.7.1. 要求

·MySQL客户端库以及MySQL 4.0.0或更高版本的包含文件。(最好是MySQL 4.0.16或更高版本)。应满足上述要求,这是因为MyODBC需要用到该版本以上的库才提供的新调用和结构。要想获得客户端库和包含文件,请访问http://dev.mysql.com/downloads/。

·必须使用“--enable-thread-safe-client”选项配置MySQL库。Libmysqlclient是作为共享库安装的。

·必须安装下述Unix ODBC驱动管理器之一:

o iodbc 3.0或更高版本(http://www.iodbc.org)

o unixodbc Alpha 3或更高版本(http://www.unixodbc.org)

·如果使用了未编译在MySQL客户端库中的字符集(默认字符集为: latin1 big5 czech euc_kr gb2312 gbk sjis tis620 ujis),就需要从字符集目录下将mysql字符定义安装到SHAREDIR中(默认情况下位于/usr/local/mysql/share/mysql/charsets)。如果在相同机器上安装了MySQL,它们应位于恰当位置。

一旦完成了所有所需文件的安装,将源码文件解包到单独目录下,并按照下面给出的说明进行操作。

26.1.7.2. 典型配置选项

使用configure脚本,能够对你所创建MyODBC的配置方式进行多种控制。典型情况下,可在“configure”命令行使用选项完成该配置操作。也可以使用环境变量来影响配置。要想了解“configure”命令支持的选项列表和环境变量,可运行下述命令:

shell> ./configure --help

下面介绍了一些常用的“configure”选项。

1. 要想编译MyODBC,须使用“--with-mysql-path=DIR”选项来提供MySQL客户端库文件和包含文件路径,其中,“DIR”是MySQL的安装目录。

可通过运行“DIR/bin/mysql_config”来确定MySQL编译选项。

2. 为ODBC驱动管理器(iodbc或unixobc)提供标准的头文件和库文件路径。

·如果你正在使用iodbc,而且iodbc未安装在其默认位置(/usr/local),可能需要使用“--with-iodbc=DIR”选项,其中,“DIR”是iodbc的安装目录。

如果iodbc头文件未位于DIR/include目录下,可使用“--with-iodbc-includes=INCDIR”选项指定它们的位置。

上面所述也适用于库文件。如果库文件未位于DIR/lib目录下,可使用“--with-iodbc-libs=LIBDIR”选项。

·如果你正在使用unixODBC,可使用“--with-unixODBC=DIR”选项(区分大小写),让configure寻找unixODBC而不是默认的iodbc,其中,“DIR”是unixODBC的安装目录。

如果unixODBC头文件和库文件未位于目录DIR/include和DIR/lib下,可使用“--with-unixODBC-includes=INCDIR”和“--with-unixODBC-libs=LIBDIR”选项。

3. 或许你也希望指定不同于“/usr/local”的安装前缀。例如,要想将MyODBC驱动安装到“/usr/local/odbc/lib”目录下,可使用“--prefix=/usr/local/odbc”选项。

最终的配置命令应与下面给出的相似:

shell> ./configure --prefix=/usr/local \
 --with-iodbc=/usr/local \
 --with-mysql-path=/usr/local/mysql

26.1.7.3. 线程安全客户端

为了将驱动程序与MySQL线程安全客户端库libmysqlclient_r.so或libmysqlclient_r.a链接起来,必须指定下述configure选项:

--enable-thread-safe

也可以使用下述选项禁止它:

--disable-thread-safe

使用该选项,能够通过mysql线程安全客户端库libmysqlclient_r.so(扩展名与操作系统有关)的链接,创建驱动程序线程安全库libmyodbc3_r.so。

在配置线程安全选项时,如果出现了配置错误,应检查config.log,检查错误是否是因系统中缺少线程库而导致的,如果是,使用LIBS选项提供一个,即

LIBS="-lpthread" ./configure ..

26.1.7.4. 共享或静态选项

可以使用下述选项启用或禁止共享和静态选项:

--enable-shared[=yes/no]--disable-shared--enable-static[=yes/no]--disable-static

26.1.7.5. 启用调试信息

默认情况下,所有的二进制分发版均会被创建为非调试版(采用“--without-debug”进行配置)。

要想启用调试信息,请使用源码分发版创建驱动程序,并在运行“configure”时使用“--with-debug”选项。

26.1.7.6. 允许文档功能

该选项仅能用于BK克隆树,而不是一般的源码分发版。

默认情况下,驱动程序是使用“--without-docs”创建的。如果希望在正常创建过程中观察文档信息,可使用下述选项进行配置:

--with-docs

26.1.7.7. 创建和编译

要想创建驱动程序库,仅需执行“make”,该命令能完成所有事项。

shell> make

如果出现错误,更正后,继续执行创建进程。如果无法创建,请发送详细的电子邮件至myodbc@lists.mysql.com,以获取进一步帮助。

26.1.7.8. 创建共享库

在大多数平台上,默认情况下,MySQL不会创建或支持“.so”(共享)客户端库,这是因为,创建共享库在过去造成过很多问题。

在这种情况下,你可以下载MySQL分发版,并使用以下选项进行配置:

--without-server --enable-shared

要想创建共享驱动程序库,必须为“configure”指定“--enable-shared”选项。默认情况下,“configure”不启用该选项。

如果使用“--disable-shared”选项进行了配置操作,可使用下述命令,从静态库创建“.so”文件。

shell> cd MyODBC-3.51.01shell> makeshell> cd drivershell> CC=/usr/bin/gcc \     $CC -bundle -flat_namespace -undefined error \ -o .libs/libmyodbc3-3.51.01.so \ catalog.o connect.o cursor.o dll.o error.o execute.o \ handle.o info.o misc.o myodbc3.o options.o prepare.o \ results.o transact.o utility.o \ -L/usr/local/mysql/lib/mysql/ \ -L/usr/local/iodbc/lib/ \ -lz -lc -lmysqlclient -liodbcinst

如果你正在使用unixODBC而不是iODBC,务必将“-liodbcinst”更改为“-lodbcinst”,并相应地配置库路径。

这样,就创建了libmyodbc3-3.51.01.so文件,并将其放在“.libs”目录下。将该文件拷贝到MyODBC库目录下(/usr/local/lib,或使用“--prefix”提供的安装目录下的“lib”目录)。

shell> cd .libs
shell> cp libmyodbc3-3.51.01.so /usr/local/lib
shell> cd /usr/local/lib
shell> ln -s libmyodbc3-3.51.01.so libmyodbc3.so

要想创建线程安全驱动程序库:

shell> CC=/usr/bin/gcc \     $CC -bundle -flat_namespace -undefined error      -o .libs/libmyodbc3_r-3.51.01.so      catalog.o connect.o cursor.o dll.o error.o execute.o      handle.o info.o misc.o myodbc3.o options.o prepare.o      results.o transact.o utility.o      -L/usr/local/mysql/lib/mysql/      -L/usr/local/iodbc/lib/      -lz -lc -lmysqlclient_r -liodbcinst

26.1.7.9. 安装驱动库

要想安装驱动程序库,请执行下述命令:

shell> make install

该命令将安装下述库集合之一:

对于MyODBC 3.51:

·libmyodbc3.so

·libmyodbc3-3.51.01.so,其中,3.51.01是驱动程序的版本

·libmyodbc3.a

对于线程安全MyODBC 3.51:

·libmyodbc3_r.so

·libmyodbc3-3_r.51.01.so

·libmyodbc3_r.a

对于MyODBC 2.5.0:

·libmyodbc.so

·libmyodbc-2.50.39.so,其中,2.50.39是驱动程序的版本

·libmyodbc.a

关于创建进程的更多信息,请参阅与源码分发版一起提供的INSTALL文件。注意,如果你试图使用Sun的“make”,可能会以错误结束。从另一方面来说,GNUgmake在所有平台上均能良好工作。

26.1.7.10. 在Unix平台上测试MyODBC

要想与你创建的库一起运行分发版中提供的示例,可执行:

shell> make test

首先,务必在odbc.ini中配置DSN 'myodbc3',并将环境变量ODBCINI指向正确的odbc.ini文件;同时MySQL服务器应处于运行状态。在驱动分发版中,可找到一个示例用odbc.ini文件。

你甚至可以更改示例/运行示例脚本,以命令行参数的形式将所需的DSN、UID和PASSWORD值传递给示例。

26.1.7.11. Mac OS X注意事项

要想在Mac OS X (Darwin)环境下创建驱动程序,可使用下述configure示例:

shell> ./configure --prefix=/usr/local
   --with-unixODBC=/usr/local
   --with-mysql-path=/usr/local/mysql
   --disable-shared
   --enable-gui=no
   --host=powerpc-apple

该命令假定unixODBC和MySQL均安装在默认位置。如不然,请进行相应配置。

在 Mac OS X环境下,“--enable-shared”选项将默认创建“.dylib”文件。你也可以采用下述方式创建“.so”文件:

shell> make
shell> cd driver
shell> CC=/usr/bin/gcc \
     $CC -bundle -flat_namespace -undefined error
 -o .libs/libmyodbc3-3.51.01.so *.o
 -L/usr/local/mysql/lib/
 -L/usr/local/iodbc/lib
 -liodbcinst -lmysqlclient -lz -lc

要想创建线程安全驱动程序库:

shell> CC=/usr/bin/gcc \
     $CC -bundle -flat_namespace -undefined error
     -o .libs/libmyodbc3-3.51.01.so *.o
     -L/usr/local/mysql/lib/
     -L/usr/local/iodbc/lib
     -liodbcinst -lmysqlclienti_r -lz -lc -lpthread

如果你正在使用unixODBC而不是iODBC,务必将“-liodbcinst”更改为“-lodbcinst”,并相应地配置库路径。

在Apple的GCC版本中,ccgcc实际上均是gcc3的符号链接。

将该库拷贝到$prefix/lib目录下,并将symlink拷贝到libmyodbc3.so。

可以使用下述命令交叉检验输出的共享库属性:

shell> otool -LD .libs/libmyodbc3-3.51.01.so

26.1.7.12. HP-UX注意事项

要想在HP-UX 10.x或11.x环境下创建驱动程序,可使用下述configure示例:

如果使用cc

shell> CC="cc" \
     CFLAGS="+z" \
     LDFLAGS="-Wl,+b:-Wl,+s" \
     ./configure --prefix=/usr/local
   --with-unixodbc=/usr/local
   --with-mysql-path=/usr/local/mysql/lib/mysql
   --enable-shared
   --enable-thread-safe

如果使用gcc

shell> CC="gcc" \
     LDFLAGS="-Wl,+b:-Wl,+s" \
     ./configure --prefix=/usr/local
   --with-unixodbc=/usr/local
   --with-mysql-path=/usr/local/mysql
   --enable-shared
   --enable-thread-safe

一旦创建了驱动程序,使用“chatr .libs/libmyodbc3.sl”交叉检查其属性,查看是否需要使用SHLIB_PATH环境变量的MySQL客户端库。对于静态版,忽略所有的共享库选项,并使用“--disable-shared”选项运行“configure”。

26.1.7.13. AIX注意事项

要想在AIX环境下创建驱动程序,可使用下述configure示例:

shell> ./configure --prefix=/usr/local
   --with-unixodbc=/usr/local
   --with-mysql-path=/usr/local/mysql
   --disable-shared
   --enable-thread-safe

注释: 关于在不同平台上创建和设置静态和共享库方式的更多信息,请参见跨平台使用静态和共享库。

26.1.8. 从BitKeeper开发源码树安装MyODBC

注释: 如果你对协助我们测试新的代码感兴趣,应阅读本节的内容。

要想获得我方的最新开发源码树,请:

1. 参见2.8.3节,“从开发源码树安装”,关于如何下载和安装BitKeeper的说明。

2. 安装完BitKeeper后,首先进入打算在其中工作的目录,然后,如果打算克隆MyODBC 3.51分支,请使用该命令:

3.   shell> bk clone bk://mysql.bkbits.net/myodbc3 myodbc-3.51

在前面的示例中,源码树是在myodbc-3.51/中设置的,或在当前目录的myodbc3/子目录下设置的(默认)。如果你位于防火墙后,而且仅能启动HTTP连接,也可以通过HTTP使用BitKeeper。如果要求使用代理服务器,可简单地设置环境变量http_proxy,使之指向代理服务器:

shell> export http_proxy="http://your.proxy.server:8080/"

执行克隆操作时,用http://替换bk://。例如:

shell> bk clone http://mysql.bkbits.net/myodbc3 myodbc-3.51

首次下载源码树时需要一段时间,具体情况取决于连接速度,请耐心等候。

4. 要想运行下一组命令,需要GNU autoconf 2.52(或更新版本),automake 1.4,libtool 1.4,以及m4。

5.   shell> cd myodbc-3.51
6.   shell> bk -r edit
7.   shell> aclocal; autoheader; autoconf;  automake;
8.   shell> ./configure  # Add your favorite options here
9.   shell> make

关于如何创建的更多信息,请参阅位于相同目录下的INSTALL文件。在Windows平台下,创建驱动程序时,请使用Windows Makefiles WIN-Makefile和WIN-Makefile_debug,更多信息,请参见26.1.6节,“在Windows平台上从源码版本安装MyODBC”。

10.完成创建后,运行make install,将MyODBC 3.51驱动程序安装到你的系统上。

11.如果进入了make阶段,但并未编译分发版本,请将其通报给myodbc@lists.mysql.com。

12.启动了bk clone操作获得源码树后,应定期运行bk pull进行更新。

13.可以使用“bk sccstool”检查树的变更史。如果你发现了有趣的差异,并对代码存在一问,请立刻发送电子邮件至myodbc@lists.mysql.com。

此外,如果你认为有更好的主意,请发送电子邮件至相同的地址并附上补丁。更改了源码后,使用“bk diffs”可生成补丁。如果你没有时间就你的观点编写代码,可发送描述性信息。

14.BitKeeper具有一个可通过bk helptool访问的帮助工具。

通过浏览http://mysql.bkbits.net:8080/myodbc3,也能在线浏览变化集、注释和源代码。

26.1.9. MyODBC配置

26.1.9.1. 什么是数据源名?
26.1.9.2. 在Windows上配置MyODBC DSN
26.1.9.3. 在Unix平台上配置MyODBC DSN
26.1.9.4. 连接参数
26.1.9.5. 没有预定义DSN下的连接
26.1.9.6. 建立从系统A到系统B的远程连接
26.1.9.7. 获取ODBC跟踪文件
26.1.9.8. 用MyODBC测试的应用程序
26.1.9.9. 已知的能与MyODBC一起工作的程序

本节介绍了配置MyODBC的方法,包括DSN创建,以及驱动程序在连接字符串中作为输入参数的不同参数。此外,还介绍了创建ODBC跟踪文件的方法。

26.1.9.1. 什么是数据源名?

“数据源”是提供数据的地点。数据源必须有稳定的标识符,即数据源名。使用数据源名,MySQL可访问初始化信息。通过初始化信息,MySQL能够了解去哪里访问数据库,以及在开始访问时使用什么设置。

事实上,数据源就是数据的路径。在不同的情况下,它可能有着不同的内容,但是在典型情况下,它指明了正在运行的MySQL服务器(例如,通过网络地址或服务器名),连接时该服务器的默认数据库,以及必要的连接信息(如端口)。MySQL驱动程序(以及Windows系统上的ODBC驱动管理器)将使用数据源进行连接。对于该目的,名为Microsoft ODBC数据源管理器的管理工具可能十分有用。

有两处可能保存初始化信息的位置: Windows注册表(Windows系统),或DSN文件(任何系统)。

如果信息位于Windows注册表中,它称为“机器数据源”。它可以是“用户数据源”,在这种情况下,只有一位用户能看到它。它也可以是“系统数据源”,在这种情况下,计算机上的所有用户均能访问它,如果用户是通过Microsoft Windows NT服务连接在一起的话,与该计算机相连的所有用户均能访问它。运行ODBC数据管理程序时,可以选择是否使用“用户”或“系统”,它们位于不同的选项卡上。

如果信息位于DSN文件中,它称为“文件数据源”。这是一种文本文件。其优点在于: (a)它适合于任何类型的计算机,而不仅仅是使用Windows操作系统的计算机;(b)其内容的拷贝或传输相对容易。

26.1.9.2. 在Windows上配置MyODBC DSN

要想在Windows平台上添加和配置新的MyODBC数据源,请使用ODBC数据源管理器。ODBC管理器能够更新数据源连接信息。添加了数据源时,ODBC管理器能够更新注册信息。

要想从控制面板打开ODBC管理器:

1. 点击“开始”,将指针指向“设置”,然后点击“控制面板”。

2. 在运行Microsoft Windows 2000或更新版本的计算机上,双击“管理工具”,然后双击“数据源”(ODBC)。在运行旧版本Windows的计算机上,双击32位ODBC或ODBC。

ODBC Data Sources Icon

打开ODBC数据源管理器对话框,如下图所示:

ODBC Data Source Administrator Dialog

点击“帮助”以了解ODBC数据源管理器对话框各选项卡的详细信息。

要想在Windows平台上添加数据源:

1. 打开ODBC数据源管理器。

2. 在ODBC数据源管理器对话框中,点击“添加”。打开“创建新数据源”对话框。

3. 选择MySQL ODBC 3.51驱动程序,然后点击“完成”。打开“MySQL ODBC 3.51驱动程序-DSN配置”对话框,如下图所示:

MySQL ODBC DSN Configuration Dialog

4. 在“数据源名”框中,输入打算访问的数据源的名称。它可以是你选择的任何有效名称。

5. 在“描述”框中,输入DSn所需的描述信息。

6. 在“主机”或“服务器名”(或IP)框中,输入准备访问的MySQL服务器主机的名称。默认情况下为localhost(本地主机)。

7. 在“数据库名”框中,输入准备用作默认数据库的MySQL数据库名称。

8. 在“用户”框中,输入你的MySQL用户名(数据库用户ID)。

9. 在“密码”框中输入密码。

10.在“端口”框中,如果端口不是默认端口,输入端口号。

11.在“SQL命令”框中,可输入建立连接后自动执行的SQL语句。

最后,对话框与下图显示的类似:

Filled-In MySQL ODBC DSN Configuration Dialog

点击“OK”添加该数据源。

注释: 点击“OK”后,将打开“数据源”对话框,ODBC管理器将更新注册信息。连接到该数据源时,你所输入的用户名和连接字符串将成为该数据源的默认连接值。

你也可以使用“测试数据源”按钮,测试你的设置是否适合于连接到服务器。该特性仅对MyODBC 3.51驱动程序有效。成功完成测试后,将显示下述窗口:

MyODBC Successful Connection Message

如果测试失败,将显示错误消息。

MyODBC Failed Connection Message

DNS配置对话框也有一个“选项”按钮。如果选择了它,将打开下述选项对话框,显示控制驱动程序的行为。关于这些选项的含义,请参见26.1.9.4节,“连接参数”。

MyODBC Options Dialog

注释: 在“驱动程序跟踪”选项下列出的选项已被禁止(灰色),除非你使用的是驱动DLL的调试版本。

要想在Windows平台上更改数据源:

1. 打开ODBC数据源管理器。点击恰当的选项卡“DSN”。

2. 选择打算更改的MySQL数据源,然后点击“配置”。打开“MySQL ODBC 3.51驱动程序-DSN配置”对话框。

3. 更改适用的数据源字段,然后点击“OK”。

更改完该对话框中的信息后,ODBC管理器将更新注册信息。

26.1.9.3. 在Unix平台上配置MyODBC DSN

在Unix平台上,可以直接在odbc.ini文件中配置DSN条目。这里给出了1个典型的odbc.ini文件,在该文件中,分别将myodbc和myodbc3配置为MyODBC 2.50和MyODBC 3.51的DSN名称:

;
;  odbc.ini对MyODBC和MyODBC 3.51驱动程序的配置
;[ODBC Data Sources]myodbc      = MyODBC 2.50 Driver DSNmyodbc3     = MyODBC 3.51 Driver DSN[myodbc]Driver       = /usr/local/lib/libmyodbc.soDescription  = MyODBC 2.50 Driver DSNSERVER       = localhostPORT =USER = rootPassword     =Database     = testOPTION       = 3SOCKET       =[myodbc3]Driver       = /usr/local/lib/libmyodbc3.soDescription  = MyODBC 3.51 Driver DSNSERVER       = localhostPORT =USER = rootPassword     =Database     = testOPTION       = 3SOCKET       =[Default]Driver       = /usr/local/lib/libmyodbc3.soDescription  = MyODBC 3.51 Driver DSNSERVER       = localhostPORT =USER = rootPassword     =Database     = testOPTION       = 3SOCKET       =

关于可提供连接参数的清单,请参见26.1.9.4节,“连接参数”。

注释: 如果你正在使用unixODBC,可使用下述工具设置DSN:

·ODBCConfig GUI tool(HOWTO: ODBCConfig)

·odbcinst

在某些情况下使用unixODBC,可能会出现下述错误:

Data source name not found and no default driver specified(数据源名不存在,未指定默认驱动程序)

如果出现该情况,请确认ODBCINI和ODBCSYSINI环境变量指向正确的odbc.ini文件。例如,如果你的odbc.ini文件位于目录“/usr/local/etc”下,可将环境变量设为:

export ODBCINI=/usr/local/etc/odbc.ini
export ODBCSYSINI=/usr/local/etc

26.1.9.4. 连接参数

你可以在ODBC.INI文件的[Data Source Name](数据源名)部分、或通过SQLDriverConnect() call的InConnectionString参量为MyODBC指定下述参数。

参数默认值注释
userODBC (on Windows)用于链接至MySQL的用户名。
serverlocalhostMySQL服务器的主机名。
database默认数据库。
option0指定MyODBC工作方式的选项。参见下面。
port3306如果服务器不是本地主机将要使用的TCP/IP端口。
stmt连接至MySQL时将要执行的语句。
password服务器上用户账户的密码。
socket当服务器是本地主机是将要连接的Unix套接字文件或Windows命名管道。

选项参量用于通知MyODBC:客户端不是100% ODBC兼容的。在Windows平台下,正常情况下,应通过切换连接屏幕上的复选框选择选项,但也能在选项参量中选择它们。下述选项是按照它们在MyODBC连接屏幕上显示的顺序排列的:

描述
1客户端无法处理,MyODBC返回列的实际宽度。
2客户端无法处理,MyODBC返回受影响行的真值。如果设置了该标志,MySQL将返回“发现的行”取而代之。MySQL的版本必须是3.21.14或更高版本,该功能才能生效。
4在c:\myodbc.log中生成调试日志。它与将MYSQL_DEBUG=d:t:O,c::\myodbc.log放到AUTOEXEC.BAT中的效果相同(在Unix平台下,该文件是/tmp/myodbc.log)。
8不为结果和参数设置任何信息报限制。
16即使驱动程序可能会给出提示,对出现的问题不予提示。
32允许或禁止动态光标支持。(在MyODBC 2.50中不允许)。
64在db_name.tbl_name.col_name中忽略数据库名的使用。
128强制使用ODBC管理器光标(实验性)。
256禁止使用扩展取数据(实验性)。
512将CHAR列填充为全列宽。
1024SQLDescribeCol()返回完全合格的列名。
2048使用压缩客户端/服务器协议。
4096通知服务器忽略函数名之后和“(”之前的空格(PowerBuilder要求这样)。这会使所有的函数名成为关键字。
8192用命名管道链接至运行在NT环境下的mysqld服务器。
16384将LONGLONG列更改为INT列(某些应用程序不能处理LONGLONG列)。
32768从SQLTables返回作为Table_qualifier和Table_owner的用户(实验性)。
65536从my.cnf的[client]和[odbc]组读取参数。
131072增加一些额外检查(不应需要之,但…)。
262144禁止事务。
524288允许将查询记录到c:\myodbc.sql(/tmp/myodbc.sql)文件。(仅在调试模式下才能启用)。
1048576不要驱动中的结果进行缓冲处理,而应从服务器读取“mysql_use_result()”。仅对正向光标才能起作用。当你不希望缓冲处理整个结果集时,对于大表处理,该选项十分重要。
2097152强制使用正向光标类型。在应用程序设置了默认静态/动态光标类型的情况下,如果希望驱动程序使用非缓冲结果集,那么该选项能够保证正向光标的行为。

要想选择多个选项,可将它们的值加在一起。例如,将选项设置为12(4+8),就能获得调试功能,但没有信息包限制。

默认的myodbc3.dll是为优化性能而编译的。如果希望调试MyODBC 3.51(例如,启用跟踪功能),应使用myodbc3d.dll。要想安装该文件,请拷贝myodbc3d.dll,使之覆盖已安装的myodbc3.dll文件。一旦完成了调试操作,务必恢复至驱动DLL的发布版本,这是因为调试版本可能会导致性能问题。注意,在MyODBC 3.51.07至3.51.11中未包含myodbc3d.dll。如果你正在使用这些版本中的一个,应从之前的版本(例如3.51.06)拷贝该DLL文件。

对于MyODBC 2.50,采用了myodbc.dll和myodbcd.dll取而代之。

在下面的表各中,给出了针对各种配置的推荐选项值:

配置选项值
Microsoft Access3
Microsoft Visual Basic3
具有很多行的大表2049
驱动跟踪生成(调试模式)4
查询日志生成(调试模式)524288
生成驱动跟踪和查询日志(调试模式)524292
具有非缓冲结果的大表3145731

26.1.9.5. 没有预定义DSN下的连接

是。通过指定DRIVER名称字段,可使用SQLDriverConnect连接到MySQL服务器。下面给出了使用DSN-Less连接的MyODBC连接字符串:

对于MyODBC 2.50:

ConnectionString = "DRIVER={MySQL};\
  SERVER=localhost;\
  DATABASE=test;\
  USER=venu;\
  PASSWORD=venu;\
  OPTION=3;"

对于MyODBC 3.51:

ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};\
  SERVER=localhost;\
  DATABASE=test;\
  USER=venu;\
  PASSWORD=venu;\
  OPTION=3;"

如果你使用的编程语言会将后跟空格的反斜杠转换为空格,最好将连接字符串指定为单个长字符串,或使用不会在其中添加空格的多个字符串串接。例如:

ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};"
  "SERVER=localhost;"
  "DATABASE=test;"
  "USER=venu;"
  "PASSWORD=venu;"
  "OPTION=3;"

关于可提供连接参数的清单,请参见26.1.9.4节,“连接参数”。

26.1.9.6. 建立从系统A到系统B的远程连接

如果你打算使用myuser和mypassword作为用户名和密码从系统B连接到系统A,可参考下面给出的简单步骤。

在系统A上,执行下述步骤:

1. 启动MySQL服务器。

2. 使用GRANT建立用户名为myuser的账户,该账户可使用密码myuser从系统B建立连接。

3.     GRANT ALL ON *.* to 'myuser'@'B' IDENTIFIED BY 'mypassword';

4. GRANT语句为用户myuser授予了使用密码mypassword从系统B进行连接的所有权限。要想执行该语句,必须在系统A上拥有根用户权限,或是具有恰当权限的另一用户。关于MySQL权限的更多信息,请参见5.8节,“MySQL用户账户管理”。

在系统B上,执行下述步骤:

1. 使用下述连接参数配置MyODBC DSN:

2.   DSN    = remote_test
3.   SERVER or HOST = A (or IP address of system A)
4.   DATABASE       = test (The default database or an appropriate one)
5.   USER   = myuser
6.   PASSWORD       = mypassword

关于建立DSN-less连接的更多信息,请参见26.1.9.5节,“没有预定义DSN下的连接”。

7. 使用Ping命令或其它方式检查是否能从系统B访问系统A。如果无法访问系统A,请检查网络或Internet连接,或与你的系统管理员联系。

8. 尝试使用DSN=remote_test进行连接。如果失败,请跟踪查询MyODBC日志,并根据日志给出的错误信息采取进一步的步骤。如果需要进一步帮助,请发送详细的电子邮件至myodbc@lists.mysql.com。

在下述站点,你可以找到关于如何完成该操作的简单示例:http://www.phphelp.com/tutorial/using-myodbc-to-connect-to-a-remote-database.html.

26.1.9.7. 获取ODBC跟踪文件

如果遇到与MyODBC有关的困难或问题,首先应使用ODBC管理器和MyODBC生成一份日志文件(请求来自ODBC ADMIN的日志时获得的日志文件)。

要想通过驱动管理器获得ODBC跟踪文件,可采取下述步骤:

·打开ODBC数据源管理器:

1. 点击“开始”,将指针指向“设置”,然后点击“控制面板”。

2. 在运行Microsoft Windows 2000、XP或2003的计算机上,双击“管理工具”,然后双击“数据源”(ODBC),如下图所示。

ODBC Data Sources Icon

在运行早期Microsoft Windows版本的计算机上,双击“控制面板”中的32位ODBC或ODBC。

3. 打开ODBC数据源管理器对话框,如下图所示:

ODBC Data Source Administrator Dialog

4. 点击“帮助”以了解ODBC数据源管理器对话框各选项卡的详细信息。

·启用跟踪选项 对于Windows和Unix平台,该步骤不同。

要想在Windows平台上启用跟踪选项:

1. 通过“ODBC数据源管理器”对话框的“跟踪”选项卡,可对跟踪ODBC函数的方式进行配置。

2. 从“跟踪”选项卡激活了跟踪功能后,驱动管理器会对后续运行的所有应用程序的ODBC函数调用进行跟踪。

3. 激活跟踪功能前所运行应用程序的ODBC函数调用不会被记录。ODBC函数调用将被记录在你指定的日志文件中。

4. 点击“现在停止跟踪”后,跟踪功能将停止。请记住,启动跟踪功能后,日志文件将不断增大,而且跟踪功能会影响所有ODBC应用程序的性能。

ODBC Tracing Tab

要想在Unix平台上启用跟踪选项:

5. 在Unix平台上,需要在ODBC.INI文件中明确设置跟踪选项。

使用TraceFile和odbc.ini中的Trace(跟踪)参数打开或关闭跟踪功能,如下所示:

TraceFile  = /tmp/odbc.trace
Trace      = 1

TraceFile指明了跟踪文件的名称和完整路径,将Trace(跟踪)设为ON或OFF。也可以使用“1”或“Yes”表示ON,以及“0”或“No”表示OFF。如果正在使用unixODBC的ODBCConfig,然后遵照HOWTO-ODBCConfig中介绍的关于跟踪unixODBC调用的指示说明。

要想生成MyODBC日志,可采取下述步骤:

6. 确保你所使用的是驱动程序调试DLL(对于MyODBC 3.51,它是myodbc3d.dll而不是myodbc3.dll,对于MyODBC 2.50,它是myodbcd.dll)。

最简单的方法是从MyODBC 3.51分发版找到myodbc3d.dll(或myodbcd.dll),并用其覆盖myodbc3.dll(或myodbc.dll),该文件通常位于C:\windows\system32或C:\winnt\system32目录下。注意,完成测试后,你或许希望恢复旧的myodbc.dll文件,这是因为它比myodbc3d.dll(或myodbcd.dll)快很多,因此,请保存原始DLL的备份。

7. 在“MyODBC连接/配置”屏幕上启用“跟踪MyODBC”选项。日志将被写入文件C:\myodbc.log。当你返回上述屏幕时,如果你设置的跟踪选项未被记住,表明你正在使用的是myodbcd.dll驱动(参见前面的介绍)。在Linux平台上,或你使用的是DSN-Less连接,需在连接字符串中提供“OPTION=4”。

8. 启动应用程序,并尝试着使其出现问题。然后检查MyODBC跟踪文件,找出可能出错的地方。

如果发现某些事项出错,请发送电子邮件至myodbc@lists.mysql.com(或support@mysql.com,如果有与MySQL AB签订的支持合同),简要描述出现的问题,并提供下述额外信息:

o MyODBC版本

o ODBC驱动管理器的类型和版本

o MySQL服务器的版本

o 驱动管理器的ODBC跟踪

o 来自MyODBC驱动的MyODBC日志文件

o 简单的可复制示例

请记住,你提供给我们的信息越多,我们更正问题的机会就越大。

此外,在提供缺陷信息前,请检查MyODBC邮件列表(http://lists.mysql.com/)。

26.1.9.8. 用MyODBC测试的应用程序

使用下述应用程序测试了MyODBC:

  • MS Access 95, 97, 2000, and 2002
  • C++-Builder, Borland Builder 4
  • Centura Team Developer (formerly Gupta SQL/Windows)
  • ColdFusion (on Solaris and NT with service pack 5), How-to: MySQL and Coldfusion. Troubleshooting Data Sources and Database Connectivity for UnixPlatforms.
  • Crystal Reports
  • DataJunction
  • Delphi
  • ERwin
  • MS Excel
  • iHTML
  • FileMaker Pro
  • FoxPro
  • Notes 4.5/4.6
  • MS Visio Enterprise 2000
  • Vision
  • Visual Objects
  • Visual Interdev
  • SBSS
  • Perl DBD-ODBC
  • Paradox
  • Powerbuilder
  • Powerdesigner 32-bit
  • MS Visual C++
  • Visual Basic
  • ODBC.NET through CSharp(C#), VB and C++
  • Data Architect(http://thekompany.com/products/dataarchitect/)
  • SQLExpress for Xbase++(http://www.SQLExpress.net)
  • Open Office (http://www.openoffice.org) How-to: MySQL + OpenOffice. How-to: OpenOffice + MyODBC + unixODBC.
  • Star Office (http://wwws.sun.com/software/star/staroffice/6.0/index.html)
  • G2-ODBC bridge (http://www.gensym.com)
  • Sambar Server (http://www.sambarserver.info) How-to: MyODBC + SambarServer + MySQL.

如果你知道能够与MyODBC一起工作的其他应用程序,请以电子邮件的方式指明它:myodbc@lists.mysql.com。

26.1.9.9. 已知的能与MyODBC一起工作的程序

大多数程序均能与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。

26.1.10. 与MyODBC连接相关的事宜

26.1.10.1. 配置MyODBC DSN时,出现不能加载翻译器或设置库错误
26.1.10.2. 连接时,出现拒绝访问错误
26.1.10.3. INFO:关于ODBC连接池

在本节中,回答了与MyODBC连接有关的问题。

26.1.10.1. 配置MyODBC DSN时,出现不能加载翻译器或设置库错误

更多信息,请参见MS知识库文章(Q260558)。此外,请确认在你的系统目录下有最新的有效ctl3d32.dll文件。

26.1.10.2. 连接时,出现拒绝访问错误

请参见5.7.8节,“拒绝访问错误的原因”。

26.1.10.3. INFO:关于ODBC连接池

关于连接池方面的信息,请参阅下述文档: http://support.microsoft.com/default.aspx?scid=kb;EN-US;q169470。

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间导入/导出的工具

关于可用工具列表,请参阅转换器一节。

26.1.12. MyODBC和Microsoft VBA及ASP

26.1.12.1. 为什么SELECT COUNT(*) FROM tbl_name返回错误?
26.1.12.2. 无论何时,当我使用AppendChunk()或GetChunk() ADO方法时,遇到错误“多步操作导致错误,请检查每个状态值”
26.1.12.3. 在ADO中如何发现受特定SQL语句影响的总行数?
26.1.12.4. 在Visual Basic中如何处理Blob数据?
26.1.12.5. 如何将Visual Basic的数据类型映射到MySQL类型?
26.1.12.6. 示例:VB与ADO、DAO和RDO
26.1.12.7. ASP和MySQL以及MyODBC
26.1.12.8. INFO:关于ActiveX数据对象(ADO)的常见问题

在本节中,回答了与Microsoft Visual Basic(ADO, DAO & RDO)和ASP一起使用MyODBC有关的问题。

26.1.12.1. 为什么SELECT COUNT(*) FROM tbl_name返回错误?

这是因为COUNT(*)表达式返回了1个BIGINT,ADO不理解这个大值的含义。选择“将BIGINT列更改为INT”选项(选项值16384)。

26.1.12.2. 无论何时,当我使用AppendChunk()或GetChunk() ADO方法时,遇到错误“多步操作导致错误,请检查每个状态值”

将光标位置指定为adUseServer时,ADO的GetChunk()和AppendChunk()方法不能按预期的方式工作。从另一方面上讲,可使用adUseClient克服该问题。

在http://www.dwam.net/iishelp/ado/docs/adomth02_4.htm上给出了一个简单示例。

26.1.12.3. 在ADO中如何发现受特定SQL语句影响的总行数?

在ADO执行方法中使用RecordsAffected属性。关于使用执行方法的更多信息,请参见http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthcnnexecute.asp。

26.1.12.4. 在Visual Basic中如何处理Blob数据?

下面给出了Mike Hillyer(m.hillyer@telusplanet.net)写的一篇好文章,其中解释了如何在ADO中通过MyODBC插入数据和/或从Blob列获取数据的方法。MySQL BLOB列和Visual Basic 6。

26.1.12.5. 如何将Visual Basic的数据类型映射到MySQL类型?

下面给出了Mike Hillyer(m.hillyer@telusplanet.net)的另一篇好文章。如何将Visual basic数据类型映射为MySQL类型。

26.1.12.6. 示例:VB与ADO、DAO和RDO

下面给出了ADO、DAO和RDO与VB一起使用的用法示例:

·ADO示例: 26.1.19节,“MyODBC与VB:ADO、DAO和RDO”

·DAO示例: 26.1.19节,“MyODBC与VB:ADO、DAO和RDO”

·RDO示例: 26.1.19节,“MyODBC与VB:ADO、DAO和RDO”

如果你有其他好的例子,或关于ADO/DAO/RDO的基本知识,请将详情发送至myodbc@lists.mysql.com。

26.1.12.7. ASP和MySQL以及MyODBC

关于如何使用MyODBC通过ASP访问MySQL的更多信息,请参阅下述文章:

·使用MyODBC通过ASP访问你的MySQL数据库

·ASP and MySQL at DWAM.NT

在http://support.microsoft.com/default.aspx?scid=/Support/ActiveServer/faq/data/adofaq.asp中,给出了关于ASP的常见问题清单。

26.1.12.8. INFO:关于ActiveX数据对象(ADO)的常见问题

更多信息,请参见ActiveX数据对象(ADO)常见问题。

26.1.13. MyODBC和第三方ODBC工具

26.1.13.1. 如何将数据从MySQL提取到MS-Word/Excel文档?
26.1.13.2. 使用MyODBC将表从MS DTS导出到MySQL时出现语法错误
26.1.13.3. 如何在Solaris平台上配置MySQL+MyODBC+unixODBC+ColdFusion

在本节中,回答了与MyODBC和各种ODBC相关工具有关的问题,如Microsoft Word、Excel和ColdFusion。

26.1.13.1. 如何将数据从MySQL提取到MS-Word/Excel文档?

要想将数据从MySQL提取到Word/Excel文档,需要使用MyODBC驱动程序以及“Microsoft查询帮助”插件。

例如,用含有两列文本的表创建1个数据库:

·使用mysql客户端命令行工具插入行。

·使用ODBC管理器创建1个DSN文件,例如,针对刚创建数据库的“my”。

·打开Word应用程序。

·创建1个新的空白文档。

·在数据库工具栏上,按“插入数据库”按钮。

·按“获取数据”按钮。

·在“获取数据”屏幕右侧,按“Ms Query”按钮。

·在“Ms Query”中使用“my DSN”文件创建1个新数据源。

·选择新查询。

·选择打算使用的列。

·如果愿意,创建1个过滤器。

·如果愿意,创建1个分类。

·选择“将数据返回到Microsoft Word”。

·点击“完成”。

·点击“插入数据”并选择记录。

·点击OK,在你的Word文档中将看到插入的行。

26.1.13.2. 使用MyODBC将表从MS DTS导出到MySQL时出现语法错误

这与当表由TEXT或VARCHAR数据类型构成时Access 97遇到的问题类似。通过将MyODBC驱动升级到3.51.02或更高版本,即可排除该错误。

26.1.13.3. 如何在Solaris平台上配置MySQL+MyODBC+unixODBC+ColdFusion

请参见MySQL ColdFusion unixODBC MyODBC和Solaris:如何成功

26.1.14. MyODBC通用功能

26.1.14.1. 如何在ODBC中获取AUTO_INCREMENT列的值
26.1.14.2. MyODBC支持动态光标类型吗?
26.1.14.3. 导致事务无法启用错误的原因是什么?
26.1.14.4. 导致无法找到光标错误的原因是什么?
26.1.14.5. 我能与MyODBC 3.51一起使用MyODBC 2.50应用程序吗?
26.1.14.6. 我能使用MyODBC从.NET环境访问MySQL吗?
26.1.14.7. MyODBC的性能为什么很差,对于相对较小的查询也会导致大量的磁盘动作?

在本节中,回答了与MyODBC一般功能有关的问题。

26.1.14.1. 如何在ODBC中获取AUTO_INCREMENT列的值

一个常见问题是,如何获取从INSERT语句自动生成的ID的值。使用ODBC,你可以作与以下示例类似的任何事(假定“auto”为AUTO_INCREMENT字段):

INSERT INTO tbl (auto,text) VALUES(NULL,'text');
SELECT LAST_INSERT_ID();

或者,如果你仅打算将ID插入到另一表中,你可以:

INSERT INTO tbl (auto,text) VALUES(NULL,'text');
INSERT INTO tbl2 (id,text) VALUES(LAST_INSERT_ID(),'text');

请参见25.2.13.3节,“如何获得上次插入行的唯一ID”。

为了使某些ODBC应用程序(至少是Delphi和Access)获得更好的性能,可使用下述查询来找到新插入的行:

SELECT * FROM tbl WHERE auto IS NULL;

26.1.14.2. MyODBC支持动态光标类型吗?

是。MyODBC 3.51支持动态光标类型以及正向和静态特性。

由于性能方面的原因,在默认情况下,驱动程序不支持该特性。你可以启用该特性,方法是,将连接选项标志指定为“OPTION=32”,或在DSN配置中选中“启用动态光标”选项。

26.1.14.3. 导致事务无法启用错误的原因是什么?

当应用程序发出事务调用,但底层MySQL服务器不支持事务或禁止事务时,驱动程序将返回该错误。

为了避免该问题,必须使用启用了InnoDB或BDB存储引擎(或两者)的服务器,并使用这类表。从4.0版以后,默认情况下,MySQL服务器均支持InnoDB。在BDB可用的平台上,MySQL-Max服务器也支持BDB。

此外,如果你的服务器支持事务表类型(InnoDB和BDB),请确保在DSN配置中未设置“禁止事务”选项。

26.1.14.4. 导致无法找到光标错误的原因是什么?

这是因为应用程序正在使用旧的MyODBC 2.50版本,不能通过SQLSetCursorName明确设置光标名称。更正它的方法是升级到MyODBC 3.51版。

26.1.14.5. 我能与MyODBC 3.51一起使用MyODBC 2.50应用程序吗?

是。如果你发现不能与MyODBC 3.51一起工作,但能与MyODBC 2.50一起工作的任何事项,请发送电子邮件至myodbc@lists.mysql.com。

26.1.14.6. 我能使用MyODBC从.NET环境访问MySQL吗?

是。你可以使用odbc.net,通过MyODBC连接到MySQL。这里给出了一些从VC.NET和VB.NET连接到MySQL的基本示例。

·请参见26.1.20.1节,“ODBC.NET: CSHARP(C#)”

·请参见26.1.20.2节,“ODBC.NET: VB”

这里给出了Venu(MyODBC开发人员)撰写的另一篇好文章研究.NET环境下的MySQL,其中,给出了所有的MySQL .NET接口以及一些有用的例子。

注意: 在与MyODBC一起使用ODBC.NET的过程中,在获取空字符串的同时(长度为0),将给出SQL_NO_DATA异常。从站点http://support.microsoft.com/default.aspx?scid=kb;EN-US;q319243,可获取针对它的补丁。

26.1.14.7. MyODBC的性能为什么很差,对于相对较小的查询也会导致大量的磁盘动作?

MyODBC比其他ODBC驱动程序快很多。缓慢可能是因未使用下述选项造成的:

·打开“ODBC跟踪”选项。遵循这里给出的指示说明,交叉检查是否未启用该选项。

ODBC Tracing Tab

如上图所示,“ODBC数据源管理器”“跟踪”选项卡的“何时跟踪”选项应始终指向“现在开始跟踪”,而不是“现在停止跟踪”。

·使用了驱动程序的调试版本。如果你正在使用驱动DLL的调试版本,也会使查询处理变慢。你可以执行交叉检查,通过驱动DLL属性(在系统目录下,右击驱动DLL并点击“属性”)的“注释”区,检查DLL是否是调试版或发布版,如下图所示:

DLL Properties Dialog

·启用了“驱动跟踪和查询日志”。即使你打算使用驱动程序的调试版(在生产环境下总应使用发布版),也应确保禁止了“驱动跟踪和查询日志”选项(OPTION=4,524288),如下图所示:

MyODBC Options Dialog

26.1.15. 基本的MyODBC应用步骤

从MyODBC应用程序执行的与MySQL服务器的交互包含以下操作:

·配置MyODBC DSN。

·连接到MySQL服务器。

·初始化操作。

·执行SQL语句。

·检索结果。

·执行事务。

·断开与服务器的连接。

大多数应用程序均使用了这些步骤的某些变体。在下图中,给出了基本的应用步骤:

MyODBC Programming Flowchart

26.1.16. MyODBC API引用

在本节中,概要介绍了按功能分类的ODBC子程序。

关于全部ODBC API参考,请参见ODBC程序员参考,http://msdn.microsoft.com/library/en-us/odbc/htm/odbcabout_this_manual.asp。

应用程序可以调用SQLGetInfo函数来获得关于MyODBC的一致性信息。为了获得驱动程序对特定函数的支持信息,应用程序可调用SQLGetFunctions。

注释: 为了向后兼容,MyODBC 3.51驱动程序支持所有已不使用的函数。

在下面的表各中,按任务分组列出了MyODBC API调用:

连接到数据源:

函数名MyODBCMyODBC一致性目的
2.503.51
SQLAllocHandleNoYesISO 92获取环境、连接、语句或描述符句柄。
SQLConnectYesYesISO 92按数据源名、用户ID和密码连接到特定驱动程序。
SQLDriverConnectYesYesODBC通过连接字符串,或驱动管理器和驱动显示对话框发出的请求,连接到特定驱动程序。
SQLAllocEnvYesYesDeprecated获得驱动程序分配的环境句柄。
SQLAllocConnectYesYesDeprecated获取连接句柄。

获取关于驱动程序和数据源的信息:

函数名MyODBCMyODBC一致性目的
2.503.51
SQLDataSourcesNoNoISO 92返回可用数据源的列表,由驱动管理器处理。
SQLDriversNoNoODBC返回已安装驱动程序和器属性的列表,由驱动管理器处理。
SQLGetInfoYesYesISO 92返回关于特定驱动程序和数据源的信息。
SQLGetFunctionsYesYesISO 92返回支持的驱动函数。
SQLGetTypeInfoYesYesISO 92返回关于所支持数据类型的信息。

设置并检索驱动属性:

函数名MyODBCMyODBC一致性目的
2.503.51
SQLSetConnectAttrNoYesISO 92设置连接属性。
SQLGetConnectAttrNoYesISO 92返回连接属性的值。
SQLSetConnectOptionYesYesDeprecated设置连接选项。
SQLGetConnectOptionYesYesDeprecated返回连接选项的值。
SQLSetEnvAttrNoYesISO 92设置环境属性。
SQLGetEnvAttrNoYesISO 92返回环境属性的值。
SQLSetStmtAttrNoYesISO 92设置语句属性。
SQLGetStmtAttrNoYesISO 92返回语句属性的值。
SQLSetStmtOptionYesYesDeprecated设置语句选项。
SQLGetStmtOptionYesYesDeprecated返回语句选项的值。

准备SQL请求:

函数名MyODBCMyODBC一致性目的
2.503.51
SQLAllocStmtYesYesDeprecated分配语句句柄。
SQLPrepareYesYesISO 92准备随后执行的SQL语句。
SQLBindParameterYesYesODBC为SQL语句中的参数分配存储器。
SQLGetCursorNameYesYesISO 92返回与语句句柄相关的光标名。
SQLSetCursorNameYesYesISO 92指定光标名。
SQLSetScrollOptionsYesYesODBC设置控制光标行为的选项。

提交请求:

函数名MyODBCMyODBC一致性目的
2.503.51
SQLExecuteYesYesISO 92执行准备好的语句。
SQLExecDirectYesYesISO 92执行语句。
SQLNativeSqlYesYesODBC返回由驱动程序翻译的SQL语句的文本。
SQLDescribeParamYesYesODBC返回语句中特定参数的描述。
SQLNumParamsYesYesISO 92返回语句中的参数数目。
SQLParamDataYesYesISO 92与SQLPutData一起使用,以便在执行时提供参数。(对于长数据值很有用)。
SQLPutDataYesYesISO 92发送某一参数数据值的部分或全部。(对于长数据值很有用)。

检索结果以及关于结果的信息:

函数名MyODBCMyODBC一致性目的
2.503.51
SQLRowCountYesYesISO 92返回插入、更新或删除请求影响的行数。
SQLNumResultColsYesYesISO 92返回结果集中的列数。
SQLDescribeColYesYesISO 92描述结果集中的列。
SQLColAttributeNoYesISO 92描述结果集中的某1列的属性。
SQLColAttributesYesYesDeprecated描述结果集中的某1列的多个属性。
SQLFetchYesYesISO 92返回多个结果行。
SQLFetchScrollNoYesISO 92返回可滚动结果行。
SQLExtendedFetchYesYesDeprecated返回可滚动结果行。
SQLSetPosYesYesODBC将光标定为在获取的数据块中,允许应用程序更新行集合中的数据,或更新或删除结果集中的数据。
SQLBulkOperationsNoYesODBC执行批量插入和批量书签操作,包括更新、删除和按书签获取。

检索错误和诊断信息:

函数名MyODBCMyODBC一致性目的
2.503.51
SQLErrorYesYesDeprecated返回额外的错误或状态信息。
SQLGetDiagFieldYesYesISO 92返回额外的诊断信息(诊断性数据结构的单个字段)。
SQLGetDiagRecYesYesISO 92返回额外的诊断信息(诊断性数据结构的多个字段)。

获取关于数据源的系统表(目录函数)条目的信息:

函数名MyODBCMyODBC一致性目的
2.503.51
SQLColumnPrivilegesYesYesODBC返回关于一个或多个表的列和相关属性的列表。
SQLColumnsYesYesX/Open返回指定表中列名的列表。
SQLForeignKeysYesYesODBC在指定表中如果存在外键,返回构成外键的列名列表。
SQLPrimaryKeysYesYesODBC返回构成某1表的主键的列名列表。
SQLSpecialColumnsYesYesX/Open返回关于最佳列集合的信息,该列集合唯一地指明了指定表中的行,或当某1事务更新了行中的任何值时自动更新的列。
SQLStatisticsYesYesISO 92返回关于单个表的统计信息,以及与表相关的索引列表。
SQLTablePrivilegesYesYesODBC返回表列表,以及与各表相关的权限。
SQLTablesYesYesX/Open返回存储在特定数据源内的表名列表。

执行事务:

函数名MyODBCMyODBC一致性目的
2.503.51
SQLTransactYesYesDeprecated提交或回滚事务。
SQLEndTranNoYesISO 92提交或回滚事务。

中止语句:

函数名MyODBCMyODBC一致性目的
2.503.51
SQLFreeStmtYesYesISO 92结束语句处理,舍弃未决结果,并释放与语句句柄相关的所有资源(可选)。
SQLCloseCursorYesYesISO 92关闭在语句句柄上打开的指针。
SQLCancelYesYesISO 92取消SQL语句。

中止连接:

函数名MyODBCMyODBC一致性目的
2.503.51
SQLDisconnectYesYesISO 92关闭连接。
SQLFreeHandleNoYesISO 92释放环境、连接、语句或描述符句柄。
SQLFreeConnectYesYesDeprecated释放连接句柄。
SQLFreeEnvYesYesDeprecated释放连接句柄。

26.1.17. MyODBC数据类型

在下表中,介绍了驱动程序将服务器数据类型映射为默认SQL和C数据类型的方法:

SQL类型C类型
bitSQL_BITSQL_C_BIT
tinyintSQL_TINYINTSQL_C_STINYINT
tinyint unsignedSQL_TINYINTSQL_C_UTINYINT
bigintSQL_BIGINTSQL_C_SBIGINT
bigint unsignedSQL_BIGINTSQL_C_UBIGINT
long varbinarySQL_LONGVARBINARYSQL_C_BINARY
blobSQL_LONGVARBINARYSQL_C_BINARY
longblobSQL_LONGVARBINARYSQL_C_BINARY
tinyblobSQL_LONGVARBINARYSQL_C_BINARY
mediumblobSQL_LONGVARBINARYSQL_C_BINARY
long varcharSQL_LONGVARCHARSQL_C_CHAR
textSQL_LONGVARCHARSQL_C_CHAR
mediumtextSQL_LONGVARCHARSQL_C_CHAR
charSQL_CHARSQL_C_CHAR
numericSQL_NUMERICSQL_C_CHAR
decimalSQL_DECIMALSQL_C_CHAR
integerSQL_INTEGERSQL_C_SLONG
integer unsignedSQL_INTEGERSQL_C_ULONG
intSQL_INTEGERSQL_C_SLONG
int unsignedSQL_INTEGERSQL_C_ULONG
mediumintSQL_INTEGERSQL_C_SLONG
mediumint unsignedSQL_INTEGERSQL_C_ULONG
smallintSQL_SMALLINTSQL_C_SSHORT
smallint unsignedSQL_SMALLINTSQL_C_USHORT
realSQL_FLOATSQL_C_DOUBLE
doubleSQL_FLOATSQL_C_DOUBLE
floatSQL_REALSQL_C_FLOAT
double precisionSQL_DOUBLESQL_C_DOUBLE
dateSQL_DATESQL_C_DATE
timeSQL_TIMESQL_C_TIME
yearSQL_SMALLINTSQL_C_SHORT
datetimeSQL_TIMESTAMPSQL_C_TIMESTAMP
timestampSQL_TIMESTAMPSQL_C_TIMESTAMP
textSQL_VARCHARSQL_C_CHAR
varcharSQL_VARCHARSQL_C_CHAR
enumSQL_VARCHARSQL_C_CHAR
setSQL_VARCHARSQL_C_CHAR
bitSQL_CHARSQL_C_CHAR
boolSQL_CHARSQL_C_CHAR

26.1.18. MyODBC错误代码

在下表中,列出了驱动程序返回的除服务器错误之外的错误代码列表:

本机代码SQLSTATE 2SQLSTATE 3错误消息
5000100001000一般警告
5010100401004字符串数据,右截
50201S0201S02选项值被更改
50301S0301S03未更新/删除行
50401S0401S04更新/删除了1个以上的行
50501S0601S06在结果集合返回第1个行集合之前视图获取数据。
5060700107002对于所有参数,未使用SQLBindParameter。
5070700507005精制语句不符合光标规范
5080700907009无效的描述符索引。
5090800208002连接名正在使用。
5100800308003连接不存在。
5112400024000无效的光标状态。
5122500025000无效的事务状态。
51325S0125S01事务状态未知。
5143400034000无效光标名。
515S1000HY000一般的驱动程序定义错误。
516S1001HY001内存分配错误。
517S1002HY002无效的列编号。
518S1003HY003无效的应用缓冲类型。
519S1004HY004无效的SQL数据类型。
520S1009HY009空指针的无效使用。
521S1010HY010函数顺序错误。
522S1011HY011现在无法设置属性。
523S1012HY012无效的事务操作码。
524S1013HY013内存管理错误。
525S1015HY015无可用的光标名。
526S1024HY024无效的属性值。
527S1090HY090无效字符串或缓冲长度。
528S1091HY091无效的描述符字段标识符。
529S1092HY092无效的属性/选项标识符。
530S1093HY093无效的参数编号。
531S1095HY095函数类型超出范围。
532S1106HY106获取类型超出范围。
533S1117HY117行值超出范围。
534S1109HY109无效的光标位置。
535S1C00HYC00可选特性未实施。
021S0121S01列计数与值计数不匹配。
02300023000完整性约束违反。
04200042000语法错误或访问冲突。
042S0242S02未发现基本表或视图。
042S1242S12未发现索引。
042S2142S21列已存在。
042S2242S22未发现列。
008S0108S01通信链接失败。

26.1.19. MyODBC与VB:ADO、DAO和RDO

26.1.19.1. ADO: rs.addNew, rs.delete和rs.update
26.1.19.2. DAO: rs.addNew, rs.update和滚动
26.1.19.3. RDO: rs.addNew和rs.update

在本节中,给出了MySQL ODBC 3.51驱动程序与ADO、DAO和RDO一起使用的一些简单示例。

26.1.19.1. ADO: rs.addNew, rs.delete和rs.update

在下面的ADO(ActiveX数据对象)示例中,创建了表my_ado,并演示了rs.addNew、rs.delete和rs.update的用法。

Private Sub myodbc_ado_Click()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field
Dim sql As String
'connect to MySQL server using MySQL ODBC 3.51 Driver(使用MySQL ODBC 3.51驱动程序连接到MySQL服务器)
Set conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};"_
      & "SERVER=localhost;"_
      & " DATABASE=test;"_
      & "UID=venu;PWD=venu; OPTION=3"
conn.Open
'create table(创建表)
conn.Execute "DROP TABLE IF EXISTS my_ado"
conn.Execute "CREATE TABLE my_ado(id int not null primary key, name varchar(20)," _
       & "txt text, dt date, tm time, ts timestamp)"
'direct insert(直接插入)
conn.Execute "INSERT INTO my_ado(id,name,txt) values(1,100,'venu')"
conn.Execute "INSERT INTO my_ado(id,name,txt) values(2,200,'MySQL')"
conn.Execute "INSERT INTO my_ado(id,name,txt) values(3,300,'Delete')"
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
'fetch the initial table ..(获取初始表…)
rs.Open "SELECT * FROM my_ado", conn
  Debug.Print rs.RecordCount
  rs.MoveFirst
  Debug.Print String(50, "-") & "Initial my_ado Result Set " & String(50, "-")
  For Each fld In rs.Fields
    Debug.Print fld.Name,
    Next
    Debug.Print
    Do Until rs.EOF
    For Each fld In rs.Fields
    Debug.Print fld.Value,
    Next
    rs.MoveNext
    Debug.Print
  Loop
rs.Close
'rs insert(rs插入)
rs.Open "select * from my_ado", conn, adOpenDynamic, adLockOptimistic
rs.AddNew
rs!Name = "Monty"
rs!txt = "Insert row"
rs.Update
rs.Close
'rs update(rs更新)
rs.Open "SELECT * FROM my_ado"
rs!Name = "update"
rs!txt = "updated-row"
rs.Update
rs.Close
'rs update second time..(rs更新第2次…)
rs.Open "SELECT * FROM my_ado"
rs!Name = "update"
rs!txt = "updated-second-time"
rs.Update
rs.Close
'rs delete(rs删除)
rs.Open "SELECT * FROM my_ado"
rs.MoveNext
rs.MoveNext
rs.Delete
rs.Close
'fetch the updated table ..(获取更新的表…)
rs.Open "SELECT * FROM my_ado", conn
  Debug.Print rs.RecordCount
  rs.MoveFirst
  Debug.Print String(50, "-") & "Updated my_ado Result Set " & String(50, "-")
  For Each fld In rs.Fields
    Debug.Print fld.Name,
    Next
    Debug.Print
    Do Until rs.EOF
    For Each fld In rs.Fields
    Debug.Print fld.Value,
    Next
    rs.MoveNext
    Debug.Print
  Loop
rs.Close
conn.Close
End Sub

26.1.19.2. DAO: rs.addNew, rs.update和滚动

在下面的DAO(数据访问对象)示例中,创建了表my_dao,并演示了rs.addNew、rs.update、以及结果集滚动的用法。

Private Sub myodbc_dao_Click()
Dim ws As Workspace
Dim conn As Connection
Dim queryDef As queryDef
Dim str As String
'connect to MySQL server using MySQL ODBC 3.51 Driver(使用MySQL ODBC 3.51驱动程序连接到MySQL)
Set ws = DBEngine.CreateWorkspace("", "venu", "venu", dbUseODBC)
str = "odbc;DRIVER={MySQL ODBC 3.51 Driver};"_
      & "SERVER=localhost;"_
      & " DATABASE=test;"_
      & "UID=venu;PWD=venu; OPTION=3"
Set conn = ws.OpenConnection("test", dbDriverNoPrompt, False, str)
'Create table my_dao(创建表my_dao)
Set queryDef = conn.CreateQueryDef("", "drop table if exists my_dao")
queryDef.Execute
Set queryDef = conn.CreateQueryDef("", "create table my_dao(Id INT AUTO_INCREMENT PRIMARY KEY, " _
 & "Ts TIMESTAMP(14) NOT NULL, Name varchar(20), Id2 INT)")
queryDef.Execute
'Insert new records using rs.addNew(使用rs.addNew插入新记录)
Set rs = conn.OpenRecordset("my_dao")
Dim i As Integer
  For i = 10 To 15
  rs.AddNew
  rs!Name = "insert record" & i
  rs!Id2 = i
  rs.Update
  Next i
   rs.Close
'rs update..(rs更新)
Set rs = conn.OpenRecordset("my_dao")
rs.Edit
rs!Name = "updated-string"
rs.Update
rs.Close
'fetch the table back...(向后获取表…)
Set rs = conn.OpenRecordset("my_dao", dbOpenDynamic)
str = "Results:"
rs.MoveFirst
While Not rs.EOF
str = " " & rs!Id & " , " & rs!Name & ", " & rs!Ts & ", " & rs!Id2
Debug.Print "DATA:" & str
rs.MoveNext
Wend
'rs Scrolling(rs滚动)
rs.MoveFirst
str = " FIRST ROW: " & rs!Id & " , " & rs!Name & ", " & rs!Ts & ", " & rs!Id2
Debug.Print str
rs.MoveLast
str = " LAST ROW: " & rs!Id & " , " & rs!Name & ", " & rs!Ts & ", " & rs!Id2
Debug.Print str
rs.MovePrevious
str = " LAST-1 ROW: " & rs!Id & " , " & rs!Name & ", " & rs!Ts & ", " & rs!Id2
Debug.Print str
'free all resources(释放所有资源)
rs.Close
queryDef.Close
conn.Close
ws.Close
End Sub

26.1.19.3. RDO: rs.addNew和rs.update

在下面的RDO(远程数据对象)示例中,创建了表my_rdo,并演示了rs.addNew和rs.update的用法。

Dim rs As rdoResultset
  Dim cn As New rdoConnection
  Dim cl As rdoColumn
  Dim SQL As String
  'cn.Connect = "DSN=test;"
  cn.Connect = "DRIVER={MySQL ODBC 3.51 Driver};"_
      & "SERVER=localhost;"_
      & " DATABASE=test;"_
      & "UID=venu;PWD=venu; OPTION=3"
  cn.CursorDriver = rdUseOdbc
  cn.EstablishConnection rdDriverPrompt
  'drop table my_rdo(舍弃表my_rdo)
  SQL = "drop table if exists my_rdo"
  cn.Execute SQL, rdExecDirect
  'create table my_rdo(创建表my_rdo)
  SQL = "create table my_rdo(id int, name varchar(20))"
  cn.Execute SQL, rdExecDirect
  'insert – direct(插入,直接)
  SQL = "insert into my_rdo VALUES (NULL,'venu')"
  cn.Execute SQL, rdExecDirect
  SQL = "insert into my_rdo VALUES (NULL,'MySQL')"
  cn.Execute SQL, rdExecDirect
  'rs insert(rs插入)
  SQL = "select * from my_rdo"
  Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect)
  rs.AddNew
  rs!id = 300
  rs!Name = "Insert1"
  rs.Update
  rs.Close
  'rs insert(rs插入)
  SQL = "select * from my_rdo"
  Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect)
  rs.AddNew
  rs!id = 400
  rs!Name = "Insert 2"
  rs.Update
  rs.Close
  'rs update(rs更新)
  SQL = "select * from my_rdo"
  Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect)
  rs.Edit
  rs!id = 999
  rs!Name = "updated"
  rs.Update
  rs.Close
  'fetch back...
  SQL = "select * from my_rdo"
  Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect)
  Do Until rs.EOF
  For Each cl In rs.rdoColumns
      Debug.Print cl.Value,
    Next
    rs.MoveNext
    Debug.Print
     Loop
  Debug.Print "Row count="; rs.RowCount
  'close(关闭)
  rs.Close
  cn.Close
End Sub

26.1.20. MyODBC与Microsoft.NET

26.1.20.1. ODBC.NET: CSHARP(C#)
26.1.20.2. ODBC.NET: VB

本节包含一些简单示例,介绍了MyODBC驱动程序与ODBC.NET一起使用的用法。

26.1.20.1. ODBC.NET: CSHARP(C#)

在下面的简单示例中创建了表my_odbc_net,并介绍了它在C#中的使用。

/*** @sample    : mycon.cs* @purpose   : Demo sample for ODBC.NET using MyODBC* @author    : Venu, <venu@mysql.com>** (C) Copyright MySQL AB, 1995-2004***//* build command**  csc /t:exe*      /out:mycon.exe mycon.cs*      /r:Microsoft.Data.Odbc.dll*/using Console = System.Console;using Microsoft.Data.Odbc;namespace myodbc3{class mycon{  static void Main(string[] args)  {    try    {      //Connection string for MyODBC 2.50      /*string MyConString = "DRIVER={MySQL};" +   "SERVER=localhost;" +   "DATABASE=test;" +   "UID=venu;" +   "PASSWORD=venu;" +   "OPTION=3";      */      //Connection string for MyODBC 3.51      string MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" +   "SERVER=localhost;" +   "DATABASE=test;" +   "UID=venu;" +   "PASSWORD=venu;" +   "OPTION=3";      //Connect to MySQL using MyODBC      OdbcConnection MyConnection = new OdbcConnection(MyConString);      MyConnection.Open();      Console.WriteLine("\n !!! success, connected successfully !!!\n");      //Display connection information      Console.WriteLine("Connection Information:");      Console.WriteLine("\tConnection String:" + MyConnection.ConnectionString);      Console.WriteLine("\tConnection Timeout:" + MyConnection.ConnectionTimeout);      Console.WriteLine("\tDatabase:" + MyConnection.Database);      Console.WriteLine("\tDataSource:" + MyConnection.DataSource);      Console.WriteLine("\tDriver:" + MyConnection.Driver);      Console.WriteLine("\tServerVersion:" + MyConnection.ServerVersion);      //Create a sample table      OdbcCommand MyCommand = new OdbcCommand("DROP TABLE IF EXISTS my_odbc_net",MyConnection);      MyCommand.ExecuteNonQuery();      MyCommand.CommandText = "CREATE TABLE my_odbc_net(id int, name varchar(20), idb bigint)";      MyCommand.ExecuteNonQuery();      //Insert      MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(10,'venu', 300)";      Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery());;      //Insert      MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(20,'mysql',400)";      Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery());      //Insert      MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(20,'mysql',500)";      Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery());      //Update      MyCommand.CommandText = "UPDATE my_odbc_net SET id=999 WHERE id=20";      Console.WriteLine("Update, Total rows affected:" + MyCommand.ExecuteNonQuery());      //COUNT(*)      MyCommand.CommandText = "SELECT COUNT(*) as TRows FROM my_odbc_net";      Console.WriteLine("Total Rows:" + MyCommand.ExecuteScalar());      //Fetch      MyCommand.CommandText = "SELECT * FROM my_odbc_net";      OdbcDataReader MyDataReader;      MyDataReader =  MyCommand.ExecuteReader();      while (MyDataReader.Read())      {       if(string.Compare(MyConnection.Driver,"myodbc3.dll") == 0) { Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " +     MyDataReader.GetString(1) + " " +     MyDataReader.GetInt64(2)); //Supported only by MyODBC 3.51       }       else { Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " +     MyDataReader.GetString(1) + " " +     MyDataReader.GetInt32(2)); //BIGINTs not supported by MyODBC       }      }      //Close all resources      MyDataReader.Close();      MyConnection.Close();    }    catch (OdbcException MyOdbcException)//Catch any ODBC exception ..    {      for (int i=0; i < MyOdbcException.Errors.Count; i++)      {Console.Write("ERROR #" + i + "\n" +  "Message: " + MyOdbcException.Errors[i].Message + "\n" +  "Native: " + MyOdbcException.Errors[i].NativeError.ToString() + "\n" +  "Source: " + MyOdbcException.Errors[i].Source + "\n" +  "SQL: " + MyOdbcException.Errors[i].SQLState + "\n");      }    }  }}}

26.1.20.2. ODBC.NET: VB

在下面的简单示例中创建了表my_vb_net,并介绍了它在VB中的用法。

' @sample    : myvb.vb' @purpose   : Demo sample for ODBC.NET using MyODBC' @author    : Venu, <venu@mysql.com>'' (C) Copyright MySQL AB, 1995-2004'''' build command'' vbc /target:exe'     /out:myvb.exe'     /r:Microsoft.Data.Odbc.dll'     /r:System.dll'     /r:System.Data.dll'Imports Microsoft.Data.OdbcImports SystemModule myvb  Sub Main()      Try  'MyODBC 3.51 connection string  Dim MyConString As String = "DRIVER={MySQL ODBC 3.51 Driver};" & _ "SERVER=localhost;" & _ "DATABASE=test;" & _ "UID=venu;" & _ "PASSWORD=venu;" & _ "OPTION=3;"  'Connection  Dim MyConnection As New OdbcConnection(MyConString)  MyConnection.Open()  Console.WriteLine ("Connection State::" & MyConnection.State.ToString)  'Drop  Console.WriteLine ("Dropping table")  Dim MyCommand As New OdbcCommand()  MyCommand.Connection = MyConnection  MyCommand.CommandText = "DROP TABLE IF EXISTS my_vb_net"  MyCommand.ExecuteNonQuery()  'Create  Console.WriteLine ("Creating....")  MyCommand.CommandText = "CREATE TABLE my_vb_net(id int, name varchar(30))"  MyCommand.ExecuteNonQuery()  'Insert  MyCommand.CommandText = "INSERT INTO my_vb_net VALUES(10,'venu')"  Console.WriteLine("INSERT, Total rows affected:" & MyCommand.ExecuteNonQuery())  'Insert  MyCommand.CommandText = "INSERT INTO my_vb_net VALUES(20,'mysql')"  Console.WriteLine("INSERT, Total rows affected:" & MyCommand.ExecuteNonQuery())  'Insert  MyCommand.CommandText = "INSERT INTO my_vb_net VALUES(20,'mysql')"  Console.WriteLine("INSERT, Total rows affected:" & MyCommand.ExecuteNonQuery())  'Insert  MyCommand.CommandText = "INSERT INTO my_vb_net(id) VALUES(30)"  Console.WriteLine("INSERT, Total rows affected:" & MyCommand.ExecuteNonQuery())  'Update  MyCommand.CommandText = "UPDATE my_vb_net SET id=999 WHERE id=20"  Console.WriteLine("Update, Total rows affected:" & MyCommand.ExecuteNonQuery())  'COUNT(*)  MyCommand.CommandText = "SELECT COUNT(*) as TRows FROM my_vb_net"  Console.WriteLine("Total Rows:" & MyCommand.ExecuteScalar())  'Select  Console.WriteLine ("Select * FROM my_vb_net")  MyCommand.CommandText = "SELECT * FROM my_vb_net"  Dim MyDataReader As OdbcDataReader  MyDataReader = MyCommand.ExecuteReader  While MyDataReader.Read      If MyDataReader("name") Is DBNull.Value Then  Console.WriteLine ("id = " & CStr(MyDataReader("id")) & "  name = " & _    "NULL")      Else  Console.WriteLine ("id = " & CStr(MyDataReader("id")) & "  name = " & _CStr(MyDataReader("name")))      End If  End While      'Catch ODBC Exception      Catch MyOdbcException As OdbcException  Dim i As Integer  Console.WriteLine (MyOdbcException.ToString)      'Catch program exception      Catch MyException As Exception  Console.WriteLine (MyException.ToString)  End Try  End SubEnd Module

26.1.21. 感谢

下面列出了一些MySQL AB公司负责MyODBC和MyODBC 3.51驱动程序开发的人员。

  • Micheal (Monty) Widenius
  • Venu Anuganti
  • Peter Harvey