26.1. MySQL Connector/ODBC
- 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个组件上,如下图所示:
·应用程序:
应用程序指的是通过调用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版本中,cc和gcc实际上均是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数据源管理器对话框,如下图所示:
点击“帮助”以了解ODBC数据源管理器对话框各选项卡的详细信息。
要想在Windows平台上添加数据源:
1. 打开ODBC数据源管理器。
2. 在ODBC数据源管理器对话框中,点击“添加”。打开“创建新数据源”对话框。
3. 选择MySQL ODBC 3.51驱动程序,然后点击“完成”。打开“MySQL ODBC 3.51驱动程序-DSN配置”对话框,如下图所示:
4. 在“数据源名”框中,输入打算访问的数据源的名称。它可以是你选择的任何有效名称。
5. 在“描述”框中,输入DSn所需的描述信息。
6. 在“主机”或“服务器名”(或IP)框中,输入准备访问的MySQL服务器主机的名称。默认情况下为localhost(本地主机)。
7. 在“数据库名”框中,输入准备用作默认数据库的MySQL数据库名称。
8. 在“用户”框中,输入你的MySQL用户名(数据库用户ID)。
9. 在“密码”框中输入密码。
10.在“端口”框中,如果端口不是默认端口,输入端口号。
11.在“SQL命令”框中,可输入建立连接后自动执行的SQL语句。
最后,对话框与下图显示的类似:
点击“OK”添加该数据源。
注释: 点击“OK”后,将打开“数据源”对话框,ODBC管理器将更新注册信息。连接到该数据源时,你所输入的用户名和连接字符串将成为该数据源的默认连接值。
你也可以使用“测试数据源”按钮,测试你的设置是否适合于连接到服务器。该特性仅对MyODBC 3.51驱动程序有效。成功完成测试后,将显示下述窗口:
如果测试失败,将显示错误消息。
DNS配置对话框也有一个“选项”按钮。如果选择了它,将打开下述选项对话框,显示控制驱动程序的行为。关于这些选项的含义,请参见26.1.9.4节,“连接参数”。
注释: 在“驱动程序跟踪”选项下列出的选项已被禁止(灰色),除非你使用的是驱动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指定下述参数。
参数 | 默认值 | 注释 |
user | ODBC (on Windows) | 用于链接至MySQL的用户名。 |
server | localhost | MySQL服务器的主机名。 |
database | 默认数据库。 | |
option | 0 | 指定MyODBC工作方式的选项。参见下面。 |
port | 3306 | 如果服务器不是本地主机将要使用的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列填充为全列宽。 |
1024 | SQLDescribeCol()返回完全合格的列名。 |
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 Access | 3 |
Microsoft Visual Basic | 3 |
具有很多行的大表 | 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),如下图所示。
在运行早期Microsoft Windows版本的计算机上,双击“控制面板”中的32位ODBC或ODBC。
3. 打开ODBC数据源管理器对话框,如下图所示:
4. 点击“帮助”以了解ODBC数据源管理器对话框各选项卡的详细信息。
·启用跟踪选项 对于Windows和Unix平台,该步骤不同。
要想在Windows平台上启用跟踪选项:
1. 通过“ODBC数据源管理器”对话框的“跟踪”选项卡,可对跟踪ODBC函数的方式进行配置。
2. 从“跟踪”选项卡激活了跟踪功能后,驱动管理器会对后续运行的所有应用程序的ODBC函数调用进行跟踪。
3. 激活跟踪功能前所运行应用程序的ODBC函数调用不会被记录。ODBC函数调用将被记录在你指定的日志文件中。
4. 点击“现在停止跟踪”后,跟踪功能将停止。请记住,启动跟踪功能后,日志文件将不断增大,而且跟踪功能会影响所有ODBC应用程序的性能。
要想在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项目时,出现“数据库”窗口。其中显示了用于创建新数据库对象和打开已有对象的快捷方式。
2. 点击打算导出的表名或查询名,然后在“文件”菜单中选择“导出”。
3. 在“导出对象类型对象名至”对话框中,在“另存为类型”框中,选择“ODBC数据库()”,如下图所示:
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数据源管理器”“跟踪”选项卡的“何时跟踪”选项应始终指向“现在开始跟踪”,而不是“现在停止跟踪”。
·使用了驱动程序的调试版本。如果你正在使用驱动DLL的调试版本,也会使查询处理变慢。你可以执行交叉检查,通过驱动DLL属性(在系统目录下,右击驱动DLL并点击“属性”)的“注释”区,检查DLL是否是调试版或发布版,如下图所示:
·启用了“驱动跟踪和查询日志”。即使你打算使用驱动程序的调试版(在生产环境下总应使用发布版),也应确保禁止了“驱动跟踪和查询日志”选项(OPTION=4,524288),如下图所示:
26.1.15. 基本的MyODBC应用步骤
从MyODBC应用程序执行的与MySQL服务器的交互包含以下操作:
·配置MyODBC DSN。
·连接到MySQL服务器。
·初始化操作。
·执行SQL语句。
·检索结果。
·执行事务。
·断开与服务器的连接。
大多数应用程序均使用了这些步骤的某些变体。在下图中,给出了基本的应用步骤:
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调用:
连接到数据源:
函数名 | MyODBC | MyODBC | 一致性 | 目的 |
2.50 | 3.51 | |||
SQLAllocHandle | No | Yes | ISO 92 | 获取环境、连接、语句或描述符句柄。 |
SQLConnect | Yes | Yes | ISO 92 | 按数据源名、用户ID和密码连接到特定驱动程序。 |
SQLDriverConnect | Yes | Yes | ODBC | 通过连接字符串,或驱动管理器和驱动显示对话框发出的请求,连接到特定驱动程序。 |
SQLAllocEnv | Yes | Yes | Deprecated | 获得驱动程序分配的环境句柄。 |
SQLAllocConnect | Yes | Yes | Deprecated | 获取连接句柄。 |
获取关于驱动程序和数据源的信息:
函数名 | MyODBC | MyODBC | 一致性 | 目的 |
2.50 | 3.51 | |||
SQLDataSources | No | No | ISO 92 | 返回可用数据源的列表,由驱动管理器处理。 |
SQLDrivers | No | No | ODBC | 返回已安装驱动程序和器属性的列表,由驱动管理器处理。 |
SQLGetInfo | Yes | Yes | ISO 92 | 返回关于特定驱动程序和数据源的信息。 |
SQLGetFunctions | Yes | Yes | ISO 92 | 返回支持的驱动函数。 |
SQLGetTypeInfo | Yes | Yes | ISO 92 | 返回关于所支持数据类型的信息。 |
设置并检索驱动属性:
函数名 | MyODBC | MyODBC | 一致性 | 目的 |
2.50 | 3.51 | |||
SQLSetConnectAttr | No | Yes | ISO 92 | 设置连接属性。 |
SQLGetConnectAttr | No | Yes | ISO 92 | 返回连接属性的值。 |
SQLSetConnectOption | Yes | Yes | Deprecated | 设置连接选项。 |
SQLGetConnectOption | Yes | Yes | Deprecated | 返回连接选项的值。 |
SQLSetEnvAttr | No | Yes | ISO 92 | 设置环境属性。 |
SQLGetEnvAttr | No | Yes | ISO 92 | 返回环境属性的值。 |
SQLSetStmtAttr | No | Yes | ISO 92 | 设置语句属性。 |
SQLGetStmtAttr | No | Yes | ISO 92 | 返回语句属性的值。 |
SQLSetStmtOption | Yes | Yes | Deprecated | 设置语句选项。 |
SQLGetStmtOption | Yes | Yes | Deprecated | 返回语句选项的值。 |
准备SQL请求:
函数名 | MyODBC | MyODBC | 一致性 | 目的 |
2.50 | 3.51 | |||
SQLAllocStmt | Yes | Yes | Deprecated | 分配语句句柄。 |
SQLPrepare | Yes | Yes | ISO 92 | 准备随后执行的SQL语句。 |
SQLBindParameter | Yes | Yes | ODBC | 为SQL语句中的参数分配存储器。 |
SQLGetCursorName | Yes | Yes | ISO 92 | 返回与语句句柄相关的光标名。 |
SQLSetCursorName | Yes | Yes | ISO 92 | 指定光标名。 |
SQLSetScrollOptions | Yes | Yes | ODBC | 设置控制光标行为的选项。 |
提交请求:
函数名 | MyODBC | MyODBC | 一致性 | 目的 |
2.50 | 3.51 | |||
SQLExecute | Yes | Yes | ISO 92 | 执行准备好的语句。 |
SQLExecDirect | Yes | Yes | ISO 92 | 执行语句。 |
SQLNativeSql | Yes | Yes | ODBC | 返回由驱动程序翻译的SQL语句的文本。 |
SQLDescribeParam | Yes | Yes | ODBC | 返回语句中特定参数的描述。 |
SQLNumParams | Yes | Yes | ISO 92 | 返回语句中的参数数目。 |
SQLParamData | Yes | Yes | ISO 92 | 与SQLPutData一起使用,以便在执行时提供参数。(对于长数据值很有用)。 |
SQLPutData | Yes | Yes | ISO 92 | 发送某一参数数据值的部分或全部。(对于长数据值很有用)。 |
检索结果以及关于结果的信息:
函数名 | MyODBC | MyODBC | 一致性 | 目的 |
2.50 | 3.51 | |||
SQLRowCount | Yes | Yes | ISO 92 | 返回插入、更新或删除请求影响的行数。 |
SQLNumResultCols | Yes | Yes | ISO 92 | 返回结果集中的列数。 |
SQLDescribeCol | Yes | Yes | ISO 92 | 描述结果集中的列。 |
SQLColAttribute | No | Yes | ISO 92 | 描述结果集中的某1列的属性。 |
SQLColAttributes | Yes | Yes | Deprecated | 描述结果集中的某1列的多个属性。 |
SQLFetch | Yes | Yes | ISO 92 | 返回多个结果行。 |
SQLFetchScroll | No | Yes | ISO 92 | 返回可滚动结果行。 |
SQLExtendedFetch | Yes | Yes | Deprecated | 返回可滚动结果行。 |
SQLSetPos | Yes | Yes | ODBC | 将光标定为在获取的数据块中,允许应用程序更新行集合中的数据,或更新或删除结果集中的数据。 |
SQLBulkOperations | No | Yes | ODBC | 执行批量插入和批量书签操作,包括更新、删除和按书签获取。 |
检索错误和诊断信息:
函数名 | MyODBC | MyODBC | 一致性 | 目的 |
2.50 | 3.51 | |||
SQLError | Yes | Yes | Deprecated | 返回额外的错误或状态信息。 |
SQLGetDiagField | Yes | Yes | ISO 92 | 返回额外的诊断信息(诊断性数据结构的单个字段)。 |
SQLGetDiagRec | Yes | Yes | ISO 92 | 返回额外的诊断信息(诊断性数据结构的多个字段)。 |
获取关于数据源的系统表(目录函数)条目的信息:
函数名 | MyODBC | MyODBC | 一致性 | 目的 |
2.50 | 3.51 | |||
SQLColumnPrivileges | Yes | Yes | ODBC | 返回关于一个或多个表的列和相关属性的列表。 |
SQLColumns | Yes | Yes | X/Open | 返回指定表中列名的列表。 |
SQLForeignKeys | Yes | Yes | ODBC | 在指定表中如果存在外键,返回构成外键的列名列表。 |
SQLPrimaryKeys | Yes | Yes | ODBC | 返回构成某1表的主键的列名列表。 |
SQLSpecialColumns | Yes | Yes | X/Open | 返回关于最佳列集合的信息,该列集合唯一地指明了指定表中的行,或当某1事务更新了行中的任何值时自动更新的列。 |
SQLStatistics | Yes | Yes | ISO 92 | 返回关于单个表的统计信息,以及与表相关的索引列表。 |
SQLTablePrivileges | Yes | Yes | ODBC | 返回表列表,以及与各表相关的权限。 |
SQLTables | Yes | Yes | X/Open | 返回存储在特定数据源内的表名列表。 |
执行事务:
函数名 | MyODBC | MyODBC | 一致性 | 目的 |
2.50 | 3.51 | |||
SQLTransact | Yes | Yes | Deprecated | 提交或回滚事务。 |
SQLEndTran | No | Yes | ISO 92 | 提交或回滚事务。 |
中止语句:
函数名 | MyODBC | MyODBC | 一致性 | 目的 |
2.50 | 3.51 | |||
SQLFreeStmt | Yes | Yes | ISO 92 | 结束语句处理,舍弃未决结果,并释放与语句句柄相关的所有资源(可选)。 |
SQLCloseCursor | Yes | Yes | ISO 92 | 关闭在语句句柄上打开的指针。 |
SQLCancel | Yes | Yes | ISO 92 | 取消SQL语句。 |
中止连接:
函数名 | MyODBC | MyODBC | 一致性 | 目的 |
2.50 | 3.51 | |||
SQLDisconnect | Yes | Yes | ISO 92 | 关闭连接。 |
SQLFreeHandle | No | Yes | ISO 92 | 释放环境、连接、语句或描述符句柄。 |
SQLFreeConnect | Yes | Yes | Deprecated | 释放连接句柄。 |
SQLFreeEnv | Yes | Yes | Deprecated | 释放连接句柄。 |
26.1.17. MyODBC数据类型
在下表中,介绍了驱动程序将服务器数据类型映射为默认SQL和C数据类型的方法:
值 | SQL类型 | C类型 |
bit | SQL_BIT | SQL_C_BIT |
tinyint | SQL_TINYINT | SQL_C_STINYINT |
tinyint unsigned | SQL_TINYINT | SQL_C_UTINYINT |
bigint | SQL_BIGINT | SQL_C_SBIGINT |
bigint unsigned | SQL_BIGINT | SQL_C_UBIGINT |
long varbinary | SQL_LONGVARBINARY | SQL_C_BINARY |
blob | SQL_LONGVARBINARY | SQL_C_BINARY |
longblob | SQL_LONGVARBINARY | SQL_C_BINARY |
tinyblob | SQL_LONGVARBINARY | SQL_C_BINARY |
mediumblob | SQL_LONGVARBINARY | SQL_C_BINARY |
long varchar | SQL_LONGVARCHAR | SQL_C_CHAR |
text | SQL_LONGVARCHAR | SQL_C_CHAR |
mediumtext | SQL_LONGVARCHAR | SQL_C_CHAR |
char | SQL_CHAR | SQL_C_CHAR |
numeric | SQL_NUMERIC | SQL_C_CHAR |
decimal | SQL_DECIMAL | SQL_C_CHAR |
integer | SQL_INTEGER | SQL_C_SLONG |
integer unsigned | SQL_INTEGER | SQL_C_ULONG |
int | SQL_INTEGER | SQL_C_SLONG |
int unsigned | SQL_INTEGER | SQL_C_ULONG |
mediumint | SQL_INTEGER | SQL_C_SLONG |
mediumint unsigned | SQL_INTEGER | SQL_C_ULONG |
smallint | SQL_SMALLINT | SQL_C_SSHORT |
smallint unsigned | SQL_SMALLINT | SQL_C_USHORT |
real | SQL_FLOAT | SQL_C_DOUBLE |
double | SQL_FLOAT | SQL_C_DOUBLE |
float | SQL_REAL | SQL_C_FLOAT |
double precision | SQL_DOUBLE | SQL_C_DOUBLE |
date | SQL_DATE | SQL_C_DATE |
time | SQL_TIME | SQL_C_TIME |
year | SQL_SMALLINT | SQL_C_SHORT |
datetime | SQL_TIMESTAMP | SQL_C_TIMESTAMP |
timestamp | SQL_TIMESTAMP | SQL_C_TIMESTAMP |
text | SQL_VARCHAR | SQL_C_CHAR |
varchar | SQL_VARCHAR | SQL_C_CHAR |
enum | SQL_VARCHAR | SQL_C_CHAR |
set | SQL_VARCHAR | SQL_C_CHAR |
bit | SQL_CHAR | SQL_C_CHAR |
bool | SQL_CHAR | SQL_C_CHAR |
26.1.18. MyODBC错误代码
在下表中,列出了驱动程序返回的除服务器错误之外的错误代码列表:
本机代码 | SQLSTATE 2 | SQLSTATE 3 | 错误消息 |
500 | 01000 | 01000 | 一般警告 |
501 | 01004 | 01004 | 字符串数据,右截 |
502 | 01S02 | 01S02 | 选项值被更改 |
503 | 01S03 | 01S03 | 未更新/删除行 |
504 | 01S04 | 01S04 | 更新/删除了1个以上的行 |
505 | 01S06 | 01S06 | 在结果集合返回第1个行集合之前视图获取数据。 |
506 | 07001 | 07002 | 对于所有参数,未使用SQLBindParameter。 |
507 | 07005 | 07005 | 精制语句不符合光标规范 |
508 | 07009 | 07009 | 无效的描述符索引。 |
509 | 08002 | 08002 | 连接名正在使用。 |
510 | 08003 | 08003 | 连接不存在。 |
511 | 24000 | 24000 | 无效的光标状态。 |
512 | 25000 | 25000 | 无效的事务状态。 |
513 | 25S01 | 25S01 | 事务状态未知。 |
514 | 34000 | 34000 | 无效光标名。 |
515 | S1000 | HY000 | 一般的驱动程序定义错误。 |
516 | S1001 | HY001 | 内存分配错误。 |
517 | S1002 | HY002 | 无效的列编号。 |
518 | S1003 | HY003 | 无效的应用缓冲类型。 |
519 | S1004 | HY004 | 无效的SQL数据类型。 |
520 | S1009 | HY009 | 空指针的无效使用。 |
521 | S1010 | HY010 | 函数顺序错误。 |
522 | S1011 | HY011 | 现在无法设置属性。 |
523 | S1012 | HY012 | 无效的事务操作码。 |
524 | S1013 | HY013 | 内存管理错误。 |
525 | S1015 | HY015 | 无可用的光标名。 |
526 | S1024 | HY024 | 无效的属性值。 |
527 | S1090 | HY090 | 无效字符串或缓冲长度。 |
528 | S1091 | HY091 | 无效的描述符字段标识符。 |
529 | S1092 | HY092 | 无效的属性/选项标识符。 |
530 | S1093 | HY093 | 无效的参数编号。 |
531 | S1095 | HY095 | 函数类型超出范围。 |
532 | S1106 | HY106 | 获取类型超出范围。 |
533 | S1117 | HY117 | 行值超出范围。 |
534 | S1109 | HY109 | 无效的光标位置。 |
535 | S1C00 | HYC00 | 可选特性未实施。 |
0 | 21S01 | 21S01 | 列计数与值计数不匹配。 |
0 | 23000 | 23000 | 完整性约束违反。 |
0 | 42000 | 42000 | 语法错误或访问冲突。 |
0 | 42S02 | 42S02 | 未发现基本表或视图。 |
0 | 42S12 | 42S12 | 未发现索引。 |
0 | 42S21 | 42S21 | 列已存在。 |
0 | 42S22 | 42S22 | 未发现列。 |
0 | 08S01 | 08S01 | 通信链接失败。 |
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