词条 | ODBC |
释义 | ODBC(OpenDatabaseConnectivity,开放数据库互连)是微软公司开放服务结构(WOSA,WindowsOpenServicesArchitecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。 ODBC是Open Database Connectivity的缩写,是MICROSOFT提出的数据库访问接口标准。ODBC定义了访问数据库的API一个规范,这些API独立于不同厂商的DBMS,也独立于具体的编程语言(但是MICROSOFT的ODBC文档是用C语言描述的,许多实际的ODBC驱动程序也是用C语言写就的。)ODBC规范后来被X/OPEN和ISO/IEC采纳,作为SQL标准的一部分,具体内容可以参看《ISO/IEC 9075-3:1995 (E) Call-Level Interface (SQL/CLI)》等相关的标准文件。 ODBC现在看来是一个比较古老的东西,在1996年左右就比较定型了,其最新的版本是3.52,MICROSOFT也不打算对它做什么大的更新,更多的目光应该被放到OLEDB、.NET DATA PROVIDER身上了。然而,正因为它是一个比较成熟和古老的规范,ODBC在大多数DBMS上都做可以使用,可以说一个像样的DBMS都应该支持ODBC 3.0或以上的版本。 如果你打算学习基于ODBC API的应用开发,最好的参考资料是MSDN。如果你打算学习如何开发一个ODBC DRIVER,最好的参考资料还是MSDN。如果你不打算采用ODBC API做开发,学习和了解ODBC也可以增加对DBMS的了解,也能更好地理解其他的数据库访问接口和技术。 一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBCAPI进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。 开放数据库互连(ODBC)是Microsoft引进的一种早期数据库接口技术。它实际上是我们要在本章后面加以讨论的ADO的前身。Microsoft引进这种技术的一个主要原因是,以非语言专用的方式,提供给程序员一种访问数据库内容的简单方法。换句话说,访问DBF文件或Access Basic以得到MDB文件中的数据时,无需懂得Xbase程序设计语言。事实上,Visual C++就是这样一个程序设计平台,即Microsoft最初是以ODBC为目标的。 你会发现,ODBC工作起来和Windows一样棗它用包含在DLL内的驱动程序完成任务。其实,ODBC提供一套两个驱动程序:一个是数据库管理器的语言,另一个为程序设计语言提供公用接口。允许Visual C++用标准的函数调用经公用接口访问数据库的内容,是这两个驱动程序的汇合点。当然,还有其它和ODBC有关的实用程序类型的DLL。例如,一个这样的DLL允许你管理ODBC数据源。ODBC的实际管理接口出现在SYSTEM文件夹中的某个CPL(控制面板)文件中棗我们在后面要谈到这方面的问题。 ODBC的确能履行承诺,提供对数据库内容的访问,并且没有太多的问题。它没有提供数据库管理器和C之间尽可能最好的数据转换,这种情况是有的,但它多半能像广告所说的那样去工作。唯一影响ODBC前程的是,它的速度极低棗至少较早版本的产品是这样。ODBC最初面世时,一些开发者曾说,因为速度问题,ODBC永远也不会在数据库领域产生太大的影响。然而,以Microsoft的市场影响力,ODBC毫无疑问是成功了。今天,只要有两种ODBC驱动程序的一种,那么几乎每一个数据库管理器的表现都会很卓越。 一、OBDC 的架构 I. 应用程序(Application) 应用程序对外提供使用者交谈界面,同时对外提供使用者交谈界面,同时对内执行资料之准备工 href=http://www.hudong.com/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B3%BB%E7%BB%9F target="_new" class=innerlink>数据库系统所传回来的结果在显示给使用者看。简单来说,应用程序藉 ODBC 界面执行下列主要工作: 1. Request a connection(i.e.session) with a data source. 2. Send SQL requests to the data source. 3. Define storage areas and data formats for the result of SQL requests. 4. Request results. 5. Process errors. 6. Request a commit or rollback of operations for transcation control. 7. Terminate a connection a data source. II. 驱动管理员(Driver Manager ) 驱动管理员本身在MS Windows中一个动态连接链接库文件(ODBC.DLL)。应用程序透过驱动管理员去加载并连结资料来源的驱动程序(driver)并连接资料来源。驱动管理员主要工作如下: 1. Uses ODBC INI file to map a data source name to a specific driver DLL. 2. Processes server ODBC initalization calls. 3. Provides entry points to ODBC functions for each driver. 4. Provides parameter validation and sequence validation for ODBC calls. III. 驱动程序(Driver) 驱动程序也是一个动态连接链接库文件,当应用程序呼叫 ODBC 函式,SQLConnect 或 SQLDriverConnect时,驱动管理员就会加载相对的驱动程序与应用程序呼应。驱动程序主要是执行 ODBC 之相对函式,并与对应之资料来源(Data Source)做沟通。驱动程序之工作如下: 1. Establishes a connect to a data source. 2. Submits requests to a data sources. 3. Trnslates data to or from other formats,if requested by the application. 4. Return results to the application. 5. Formats errors into standard error codes and returns them to the application. 6. Declares and manipulates cursors if necessary (invisible to the application). 7. Initiates transactions if the data source requires explicit transaction initiation(invisible to the app). IV. 资料来源(Data Source) 资料来源唯一数据库系统(DMBS)或是数据库操作系统的一个组合。举例来说,应用库系统可以同时与下列两个或其中一个资料来源连接。 1. A DBMaker DBMS running on a Microsoft Windows NT accessed by NTaccessed by TCP/IP. 2. A Tandem NonStop SQL DBMS running on the Guardian 90 accessed via a gateway. 应用系统程序透过标准资料来ODBC界面与源连接,因此开发过程中不需指定特定的数据库系统,所以数据库系统的开放性从此被建立。笔者认为在计算机系统进入开放时代之时,我们应可体会到标准的建立与系统的发展是同样的重要。而信息系统架构在数据库的必要性也随着信息化社会的蓬勃发展而更形重要, 因此在ODBC标准日益成熟的同时,我们也同时可以感受到数据库系统在开放架构下,更须扮演强而有力的角色。 依据 ODBC 的规格,其界面共可分为以下九类界面函数: I. 连接资料来源(Connecting to a Data Source) 1. SQLAllocEnv. 2. SQLAllocConnect. 3. SQLConnect. 4. SQLPriverConnect. 5. SQLBrowseConnect. II. 取得驱动程序及资料来源的相关讯息 1. SQLDataSource. 2. SQLGetInfo. 3. SQLGetFunctions. 4. SQLGetTypeInfo. III. 设定及取得驱动程序的选项 1. SQLSetConnectOption. 2. SQLGetConnectOption. 3. SQLSetStmtOption. 4. SQLGetStmtOption. IV. 准备SOL指令之需求 1. SQLAllocStmt. 2. SQLPrepare. 3. SQLSetParam. 4. SQLParamOptions. 5. SQLGetCursorName. 6. SQLSetCursorName. 7. SQLSetScrollOptions. V. 传送及执行需求 1. SQLExecute. 2. SQLExecDirect. 3. SQLNativeSql. 4. SQLDescribeParanl. 5. SQLNumParams. 6. SQLParamData. 7. SQLPutData. VI. 取得执行结果及有关结果的讯息 1. SQLRowCount. 2. SQLNumResultCols. 3. SQLDescribeCol. 4. SQLColAttributes. 5. SQLBindCol. 6. SQLFetch. 7. SQLExtendedFetch. 8. SQLGetData. 9. SQLSetDos. 10. SQLMoreResults. 11. SQLError. VII. 取得有关资料来源系统回录(System tables or Catalog)的讯息 1. SQLColumnPrivileges. 2. SQLColumns. 3. SQLForeignkeys. 4. SQLPrimaryKeys. 5. SQLProcedureColumns. 6. SQLProcedures. 7. SQLSpecialColumns. 8. SQLStatistics. 9. SQLTablePrivileges. 10. SQLTables. VIII. 结束 SQL 指令需求 1. SQLFreeStmt. 2. SQLCancel. 3. SQLTransact. IX. 结束与资料来源的连接 1. SQLDisconnect. 2. SQLFreeConnect. 3. SQLFreeEnv. 以上所列之 ODBC 界面函数,我们发现全都以 SQL 为开头。除以上述分类外,各个函数在其必要性或复杂度上, 更被规定在不同的几个层级中 ODBC 函数的层级为核心层(Core level),第一层(Level 1),和第二层(Level 2)。 我们再来看一个很基本的应用程序步骤是如何呢? 下图告诉我们这个答案。 ODBC程序流程 回顾 ODBC 的架构及其执行过程,ODBC 造就了"应用程序独立性(Application Independency)"的特性,使应用程序不需在乎资料来源是何种数据库系统或者纯粹是个资料或文本文件,只要相对驱动程序能完成衔接的功能,则应用程序即可达到高度的独立性。 二、ODBC 分为单束式和多束式两类 ODBC 使用层次的方法来管理数据库,在数据库通信结构的每一层,对可能出现依赖数据库产品自身特性的地方,ODBC 都引入一个公共接口以解决潜在的不一致性,从而很好地解决了基于数据库系统应用程序的相对独立性,这也是ODBC 一经推出就获得巨大成功的重要原因之一。 从结构上分,ODBC 分为单束式和多束式两类。 单束式驱动程序 单束式驱动程序介于应用程序和数据库之间,像中介驱动程序一样数据提供一个统一的数据访问方式。 当用户进行数据库操作时,应用程序传递一个ODBC 函数调用给ODBC 驱动程序管理器,由ODBC API 判断该调用是由它直接处理并将结果返回还是送交驱动程序执行并将结果返回。 由上可见,单束式驱动程序本身是一个数据库引擎,由它直接可完成对数据库的操作,尽管该数据库可能位于网络的任何地方。 多束式驱动程序 多束式驱动程序负责在数据库引擎和客户应用程序之间传送命令和数据,它本身并不执行数据处理操作而用于远程操作的网络通信协议的一个界面。 前端应用程序提出对数据库处理的请求,该请求转给ODBC 驱动程序管理器,驱动程序管理器依据请求的情况,就地完成或传给多束驱动程序,多束式驱动程序将请求翻译为特定厂家的数据库通信接口(如Oracle 的SQLNet)所能理解的形式并交于接口去处理,接口把请求经网络传送给服务器上的数据引擎,服务器处理完后把结果发回给数据库通信接口,数据库接口将结果传给多束式ODBC 驱动程序,再由驱动程序将结果传给应用程序。 三、使用ODBC 在可以用ODBC做任何事之前,必须有一个数据库棗至少在脑子里。在一个像Access这样的应用程序中创建数据库框架通常会更容易一些,因为Access可以非常轻松地提供完成任务所需的各种功能。但是,如果你至少安装了所需的ODBC驱动程序,那就可以在C++中创建程序框架。一设计了数据库,就要为其创建ODBC数据源,我们会在本节中看到这一点。下面的过程并没有严格地说明活动的经过,只是说明了一种配置数据源的技术。 注释 我会在第5章中说明如何创建一个Access数据库。现在,我们只是看一看,为了访问那个数据库,我们下一步要做些什么。 1. 双击Control Panel(控制面板)中的32位ODBC小程序(如果当前系统上未安装16位驱动程序,那么一些版本的Windows使用简单的ODBC小程序)。你会看到ODBC Data Source Administrator(ODBC数据源管理员)对话框,如下图所 DSN(用户数据源名)选项卡。对系统级数据库来说,使用System DSN(系统数据源名)选项卡;对文件级数据源(从严格意义上说,它不是数据库),使用File DSN(文件数据源名)选项卡。你还会看到一个数据库的缺省选项。如果想从Visual C++内部创建数据库,就会用到这个选项。 警告 对本地数据库来说,通常要在User DSN(用户DSN)选项卡上创建一个项;对远程数据库,则在System DSN(系统DSN)选项卡上创建。任何情况下,都不能在User DSN(用户DSN)和System DSN(系统DSN)选项卡上创建同名的项。通常会出现的问题是,你试图访问远程数据库,但从Web服务器获得了非常奇怪和矛盾的错误消息。事实上,如果在远程数据库访问期间得到了奇怪的错误消息,那么32位ODBC小程序是首先应该查看的地方之一。 2. 单击Add按钮。会看到Create New Data Source(创建新的数据源)对话框,如下图所示。 技巧 检查ODBC Data Source Administrator(ODBC数据源管理员)对话框的About选项卡,可以确定你正在使用的ODBC驱动程序的最新版本。这个选项卡包含了各种ODBC DLL的版本号、生产厂商的名称以及出现在SYSTEM文件夹中的文件名。大多数情况下,通过查看版本号可以验证ODBC驱动程序是否是最新的版本。 3. 选择一个数据源。对本练习来说,我选择了Access数据源。单击Finish(完成),会看到某种类型的配置对话框,如下面的ODBC Microsoft Access 97Setup(设置)对话框所示。 注释 如果你选择的数据源和我在本实例中选择的不同,那么所需的配置步骤也和这里说明的不同棗每个ODBC驱动程序都要求不同类型的配置。 4. 在Data Source Name(数据源名)域内输入数据源名称。一定要选择意义明确但又不过于冗长的名称。我选择Food Database(食品数据库),因为我最终要创建一个与食品库存有关的数据库的链接。 5. 在Description(描述)域内输入一段说明性文字。可以让这个项比上一个项稍长一些,因为它描述数据库的用途。另一方面,也不要写入像《战争与和平》那样大的小说。对本练习,我输入了:This database contains inventoryinformation for a food store(本数据库包含食品存储的库存信息)。 6. 单击Select(选择)按钮。你会看到一个File Open-type(文件打开类型)对话框,可以在那里选择一个现有的数据库。ODBC驱动程序会自动选择正确的文件扩展名。 技巧 并不是一定要提前设计数据库。请注意,Access ODBC驱动程序还包括一个创建新数据库的按钮。很多ODBC驱动程序都提供了这种功能,但并不是全都这样。单击这个按钮会启动数据库管理器应用程序,并允许你设计数据库。注意有一点很有意思,Access ODBC驱动程序还会允许你使用这个对话框压缩或修补数据库。 7. 选择系统数据库选项。在大多数情况下要选择None(无),除非你为应用程序特别创建了一个系统数据库。如果确实添加了系统数据库,它会出现在ODBC Microsoft Access 97 Setup(设置)对话框的System DSN(系统DSN)选项卡上。 8. 单击Advanced(高级)按钮,会看到Set Advanced Options(设置高级选项)对话框,如下图所示。无需对很多项做修改。但是,要把客户名添加到LoginName(注册名)域中,把客户口令添加到Password(口令)域中。这允许客户在访问你的数据库时,根本不用了解访问的细节——甚至不用了解被记录的客户名。 技巧 为最优化潜在的区域,可以浏览一下ODBC驱动程序提供的一系列高级选项。例如,Access ODBC允许你更改DBMS所用的线程数量。缺省设置3通常提供了不错的性能,但是你会发现,复杂程序中线程多一些的话,可以提高前台任务的速度。由于Windows使用了一些处理器循环对线程实施管理,所以使用了过多的线程又会降低应用程序的速度。 9. 设置完所需的高级选项后单击OK。 10. 再次单击OK关闭ODBC Microsoft Access 97 Setup(设置)对话框。应该看到,新的设置项已经添加到ODBC Data Source Administrator(ODBC数据源管理员)对话框中。如果今后要为数据库更改这些设置,只要简单地加亮它并单击Configure(配置)。删除数据库配置也很容易,只要加亮DSN并单击Remove(删除)即可。 创建系统DSN和制作用户DSN差不多。两者间一个显著的差别是,使用它们的目的不同。系统DSN告诉应用程序如何与数据库相连,在一些情况下如何与之交互作用。系统DSN不包含数据库所需的任何数据——它包含连接标准,其中可以包括从用户列表到重要文件位置的一切信息。 四、文件DSN 你可能已经注意到了,上一节中的实例有问题。如果想单独配置网络上的每一台机器,它会工作得很好,但这可能不是一个好主意。还有一种存储创建数据源所需信息的方式:文件DSN。这正是我们要在本节中讨论的。下面的过程说明了设置文件DSN的一般方法。 1. 双击Control Panel(控制面板)中的32位ODBC小程序,会看到ODBCData Source Administrator(ODBC数据源管理员)对话框。选择File DSN(文件DSN)选项卡,会看到如下图所示的对话框。要做的第一件事是,选择存储DSN信息的地方。 2. 单击Look In(观察)下拉列表框,会看到一系列当前机器的目录和驱动器。可以为DSN使用任何存储位置。我通常在网络上选择数据库存储目录。使用UNC(通用命名标准)意味着,每个人都会用相同的路径来访问DSN文件。 技巧 Up One Level(上一和在Explorer中是一样的。可以用该按钮返回到上一级目录。最后,你会在My Computer(我的电脑)处结束,看到机器上所有驱动器的清单。 3. 单击Add(添加),会看到Create New Data Source(创建新的数据源)对话框。 4. 在列表中选择一个ODBC驱动程序,然后单击Next(下一个)。对本示例来说,我再次选择Access。你会看到Create New Data Source(创建新的数据源)对话框的下一页显示出来。在这里选择数据源的名称和存储位置。单击Browse(浏览)会看到File Open-type(文件打开类型)对话框,在这里选择存储位置。输入一个文件名,ODBC向导自动添加DSN作为扩展名。在本示例中,我选择SAMPLE.DSN作为DSN文件的名称。 5. 单击Next(下一个)会看到一个摘要对话框,如下图所示。它说明正准备创建的DSN的参数。 6. 单击Finish(完成)。这时,会看到ODBC Microsoft Access 97 Setup(设置)对话框的修改版。不能像我们在上一节所做的那样,在Data Source Name(数据源名)或Description(描述)字段中添加信息了,不过,其它的都和以前一样。 7. 一定要单击Select(选择)按钮输入数据库的名称,然后选择想要使用的数据库(如果想创建一个新数据库,也可以单击Create(创建))。 8. 完成配置过程时单击OK,你会在ODBC Data Source Administrator(ODBC数据源管理员)对话框中看到一个新的DSN文件项。 和我们创建的前一个DSN不同,这个DSN实际上创建可以用文本编辑器来查看和编辑的文件。图4.1显示了我的文件的外观。请注意,它符合标准的INI文件格式。你可以在顶端看到【ODBC】标题。下面是我选择的全部设置。这个文件允许我从Visual C++选择数据源,而机器间的传输也是非常容易的。我甚至能在安装过程中按要求更改位置——在你不知道用户会有什么样的设置时,这一点确实很不错。 五、记录ODBC事务 调试应用程序时加以记录,这一点很重要。ODBC Data Source Administrator(ODBC数据源管理员)对话框也提供了这样的功能。可以选择跟踪你通过ODBC对数据库进行的各种事务。当然,这些记录可能会变得相当大,但我们并不是总要使用它们。 开始记录事务时,只要双击控制面板(Control Panel)中的32位ODBC小程序,打开ODBC Data Source Administrator(ODBC数据源管理员)对话框。选择Tracing(跟踪)选项卡,你会看到如下图所示的对话框(请注意,该对话框的Windows 98版本略有不同)。 如你所见,有三个单选按钮确定何时跟踪ODBC调用。缺省设置是Don'tTrace(不跟踪)。如果打算调试单个应用程序,应该选择All the Time(全部时间)。One-Time Only(只一次)在下一次连接期间跟踪ODBC调用棗只要连接一拆除,跟踪就关闭。当用户带着特定的问题调用时,这是一个不错的选择。可以监视一次会话期间的连接,然后用该信息帮助创建排除错误的计划。 跟踪不会自动开始。还要单击对话框右侧的Start Tracing Now(现在开始跟踪)。只要跟踪一开始,按钮标题就变成Stop Tracing Now(现在停止跟踪)。再次单击按钮关闭跟踪过程。 唯一要担心的其它设置是Log File Path(记录文件路径)。ODBC通常在根目录下的SQL.LOG文件中放入事务信息。但是,也可以将该信息放在网络驱动器上,或者用户看不到的地方。在调试过程中,缺省位置通常就比较适宜。 注释 除非你想创建自己的日志记录DLL,否则不要更改Custom Trace DLL(自定义跟踪DLL)域内的设置。在这里列出的DLL棗ODBCTRAC.DLL棗负责维持事务记录。 |
随便看 |
百科全书收录594082条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。