ODBC接口规范

ODBC实际上是一个数据库访问函数库,使应用程序可以直接操纵数据库中的数据。ODBC是基于SQL语言的,是一种在SQL和应用界面之间的标准接口,他解决了嵌入式SQL接口非规范核心,免除了应用软件随数据库的改变而改变的麻烦。ODBC的一个显著优点是,用它生成的程序是与数据库或数据库引擎无关的,为数据库用户和开发人员屏蔽了异构环境的复杂性,提供了数据库访问的统一接口,为应用程序实现与平台的无关性和可移植性提供了基础,因而ODBC获得了广泛的支持和应用。

ODBC的结构如下图所示,他又四个主要成分构成:应用程序、驱动程序管理器、驱动程序、数据源。

 

1.应用程序(Application)  

应用程序执行处理并调用ODBC函数,其主要任务如下:

连接数据库
提交SQL语句给数据库
检索结果并处理错误
提交或者回滚SQL语句的事务
与数据库断开连接
2.驱动程序管理器(Driver Manager)

每种数据库引擎都需要向ODBC驱动程序管理器注册他自己的ODBC驱动程序,这种驱动程序对于不同的数据库引擎是不同的。ODBC驱动程序管理器能将与ODBC兼容的SQL请求从应用程序传给驱动程序,随后由驱动程序把对数据库的操作翻译成相应数据库引擎所提供的固有调用,对数据库实现访问操作。

3.驱动程序

ODBC通过驱动程序来提供数据库独立性。驱动程序是一个用于支持ODBC函数调用的模块,应用程序调用驱动程序所支持的函数来操纵数据库。若想使应用程序操作不同类型的数据库,就要动态连接到不同的驱动程序上。ODBC驱动程序处理ODBC函数调用,将应用程序的SQL请求提交给指定的数据源,接受由数据源返回的结果,传回给应用程序。

4.数据源

数据源是用户、应用程序要访问的数据文件或数据库,以及访问他们需要的有关信息。它定义了数据库服务器的名称、登录名和密码等选项。

5.ODBC数据源的配置
--------------------- 

2.      常用接口:

  • 连接到数据源

下面的函数用于连接到数据源:

(1)SQLAllocHandle:分配环境、连接、语句或者描述符句柄。

(2)SQLConnect:建立与驱动程序或者数据源的连接。访问数据源的连接句柄包含了包括状态、事务申明和错误信息的所有连接信息。

(3)SQLDriverConnect:与SQLConnect相似,用来连接到驱动程序或者数据源。但它比SQLConnect支持数据源更多的连接信息;

(4)SQLBrowseConnect:支持一种交互方法来检索或者列出连接数据源所需要的属性和属性值。

  • 获取驱动程序和数据源信息

下面的函数用来获取驱动程序和数据源信息:

(1)SQLDataSources:能够被调用多次来获取应用程序使用的所有数据源的名字。

(2)SQLDrivers:返回所有安装过的驱动程序清单,包括对它们的描述以及属性关键字。

(3)SQLGetInfo:返回连接的驱动程序和数据源的元信息。

(4)SQLGetFunctions:返回指定的驱动程序是否支持某个特定函数的信息。

(5)SQLGetTypeInfo:返回指定的数据源支持的数据类型的信息。

  • 设置或者获取驱动程序属性

下面的函数用来设置或者获取驱动程序属性:

(1)SQLSetConnectAttr:设置连接属性值。

(2)SQLGetConnectAttr:返回连接属性值。

(3)SQLSetEnvAttr:设置环境属性值。

(4)SQLGetEnvAttr:返回环境属性值。

(5)SQLSetStmtAttr:设置语句属性值。

(6)SQLGetStmtAttr:返回语句属性值。

  • 设置或者获取描述符字段

下面的函数用来设置或者获取描述符字段:

(1)SQLGetDescField:返回单个描述符字段的值。

(2)SQLGetDescRec:返回当前描述符记录的多个字段的值。

(3)SQLSetDescField:设置单个描述符字段的值。

(4)SQLSetDescRec:设置描述符记录的多个字段。

  • 准备SQL语句

下面的函数用来准备SQL语句:

(1)SQLPrepare:准备要执行的SQL语句。

(2)SQLBindParameter:在SQL语句中分配参数的缓冲区。

(3)SQLGetCursorName:返回与语句句柄相关的游标名称。

(4)SQLSetCursorName:设置与语句句柄相关的游标名称。

(5)SQLSetScrollOptions:设置控制游标行为的选项,在ODBC 3.0 中被SQLGetInfo和SQLSetStmtAttr接口替代

  • 提交SQL请求

下面的函数用来提交SQL请求:

(1)SQLExecute:与SQLPrepare共同使用,执行准备好的SQL语句。

(2)SQLExecDirect:执行一条SQL语句。

(3)SQLNativeSql:返回驱动程序对一条SQL语句的翻译,并不执行sql语句。

(4)SQLDescribeParam:返回对SQL语句中指定参数的描述。

(5)SQLNumParams:返回SQL语句中参数的个数。

(6)SQLParamData:与SQLPutData联合使用在运行时给参数赋值。

(7)SQLPutData:在SQL语句运行时给部分或者全部参数赋值。

  • 检索结果集及其相关信息

下面的函数用来检索结果集及其相关信息:

(1)SQLRowCount:返回INSERT、UPDATE或者DELETE等语句影响的行数。

(2)SQLNumResultCols:返回结果集中列的数目。

(3)SQLDescribeCol:返回结果集中列的描述符记录。

(4)SQLColAttribute:返回结果集中列的属性。

(5)SQLBindCol:为结果集中的列分配缓冲区。

(6)SQLFetch:在结果集中检索下一行元组。

(7)SQLFetchScroll:返回指定的结果行。

(8)SQLGetData:返回结果集中当前行某一列的值。

(9)SQLSetPos:在取到的数据集中设置游标的位置。这个记录集中的数据能够刷新、更新或者删除。

(10)SQLBulkOperations:执行块插入和块书签操作,其中包括根据书签更新、删除或者取数据。

(11)SQLMoreResults:确定是否能够获得更多的结果集,如果能就执行下一个结果集的初始化操作。

(12)SQLGetDiagField:返回一个字段值或者一个诊断数据记录。

(13)SQLGetDiagRec:返回多个字段值或者一个诊断数据记录。

  • 取得数据源系统表的信息

下面的函数用来取得数据源系统表的信息:

(1)SQLColumnPrivileges:返回一个关于指定表的列的列表以及相关的权限信息。

(2)SQLColumns:返回指定表的列信息的列表。

(3)SQLForeignKeys:返回指定表的外键信息的列表。

(4)SQLPrimaryKeys:返回指定表的主键信息的列表。

(5)SQLProcedureColumns:返回指定存储过程的参数信息的列表。

(6)SQLProcedures:返回指定数据源的存储过程信息的列表。

(7)SQLSpecialColumns:返回唯一确定某一行的列的信息,或者当某一事务修改一行的时候自动更新各列的信息。

(8)SQLStatistics:返回一个单表的相关统计信息和索引信息。

(9)SQLTablePrivileges:返回相关各表的名称以及相关的权限信息。

(10)SQLTables:返回指定数据源中表信息。

  • 终止语句执行

下面的函数用来终止语句执行:

(1)SQLFreeStmt:终止语句执行,关闭所有相关的游标,放弃没有提交的结果,选择释放与指定语句句柄相关的资源。

(2)SQLCloseCursor:关闭一个打开的游标,放弃没有提交的结果。

(3)SQLCancel:放弃执行一条SQL语句。

(4)SQLEndTran:提交或者回滚事务。

  • 中断连接

下面的函数处理中断连接的任务:

(1)    SQLDisconnect:关闭指定连接。

(2)    SQLFreeHandle:释放环境、连接、语句或者描述符句柄。

 

在数据库发展的前几十年里,数据以各种不同的方式存储并展现给用户,比如:层次数据库网状数据库,这些都是非关系数据库。

直到1970年,才出现了“关系模型”,借助冗余数据来链接不同表中的记录,关系数据库中的每张表都包含一项作为每行唯一标识的信息(主键)。

关系型数据库:

Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL

非关系型数据库:

NoSql、Cloudant、MongoDb、redis、HBase

  在最初的时候,对数据库的程序访问是由本机库来执行的,例如SQL Server的DBLib、Oracle的OCI。

这种方式的优点就是速度快,但缺点更明显,开发人员需使用不同的API来访问不同的数据库系统。一旦更换数据库,工作量将会很大。

  一.ODBC(Open Database Connectivity)开放数据库连接

是为解决异构数据库间的数据共享而产生的,允许应用程序以SQL 为数据存取标准,存取不同DBMS(关系型数据管理系统)管理的数据;

使应用程序直接操纵DB中的数据,免除随DB的改变而改变。用ODBC 可以访问各类计算机上的DB文件,甚至访问如Excel 表和ASCI I数据文件这类非数据库对象。

它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。

总而言之,ODBC提供了一个公共数据访问层,可用来访问几乎所有的RDBMS。

  优点:一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBCAPI进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。

  二.DAO(Data Access Object)数据访问对象

它显露了 Microsoft Jet 数据库引擎(由 Microsoft Access 所使用),并允许 Visual Basic 开发者通过 ODBC 像直接连接到其他数据库一样,直接连接到 Access 表。

所以如果数据库是Access数据库且是本地使用的话,建议使用这种访问方式。

  三.RDO(Remote Data Objects)远程数据对象

让写Windows应用程序的程序师能够进入微软和其他的数据库供给者的数据库。

然后,程序中RDO 陈述使用微软的底层数据存取对象 (DAO) 来实际进入数据库。 数据库供给者写入DAO接口。

是一个到 ODBC 的、面向对象的数据访问接口,它同易于使用的 DAO style组合在一起,提供了一个接口,形式上展示出所有 ODBC 的底层功能和灵活性。尽管 RDO 在很好地访问 Jet 或 ISAM 数据库方面受到限制,而且它只能通过现存的 ODBC 驱动程序来访问关系数据库。但是,RDO 已被证明是许多 SQL Server、Oracle 以及其他大型关系数据库开发者经常选用的最佳接口。RDO 提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。

  四.OLE DB(Object Linking and Embedding, Database)对象连接嵌入数据库

是微软的战略性的通向不同的数据源的低级应用程序接口,OLE DB不仅包括微软资助的标准数据接口ODBC的结构化查询语言(SQL)能力,还具有面向其他非SQL数据类型的通路。

OLE DB 是建立在 ODBC 功能之上的一个开放规范,ODBC 是为访问关系型数据库而专门开发的,OLE DB 则用于访问关系型和非关系型信息源。

 

OLE DB 最主要是由三个部分组合而成:

 

Data Providers 数据提供者
凡是透过OLE DB 将数据提供出来的,就是数据提供者。例如SQL Server 数据库中的数据表,或是附文件名为mdb 的Access 数据库档案等,都是Data Provider。

 

Data Consumers 数据使用者
凡是使用OLE DB 提供数据的程序或组件,都是OLE DB 的数据使用者。换句话说,凡是使用ADO 的应用程序或网页都是OLE DB 的数据使用者。

 

Service Components 服务组件
数据服务组件可以执行数据提供者以及数据使用者之间数据传递的工作,数据使用者要向数据提供者要求数据时,是透过OLE DB 服务组件的查询处理器执行查询的工作,而查询到的结果则由指针引擎来管理。
 
OLE DB 与ODBC 的关系
由于OLE DB 和ODBC 标准都是为了提供统一的访问数据接口,所以曾经有人疑惑:OLE DB 是不是替代ODBC 的新标准?答案是否定的。实际上,ODBC 标准的对象是基于SQL 的数据源(SQL-Based Data Source),而OLE DB 的对象则是范围更为广泛的任何数据存储。从这个意义上说,符合ODBC 标准的数据源是符合OLE DB 标准的数据存储的子集。符合ODBC 标准的数据源要符合OLE DB 标准,还必须提供相应的OLE DB 服务程序(Service Provider),就像SQL Server 要符合ODBC 标准,必须提供SQL Server ODBC 驱动程序一样。现在,微软自己已经为所有的ODBC 数据源提供了一个统一的OLE DB 服务程序,叫做ODBC OLE DB Provider。

 

  五.ADO(ActiveX Data Object)活动数据对象

 ADO是DAO/RDO的后继产物。ADO 2.0在功能上与RDO更相似,而且一般来说,在这两种模型之间有一种相似的映射关系。ADO"扩展"了DAO和 RDO 所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。 作为最新的数据库访问模式,ADO的使用也是简单易用,所以微软已经明确表示今后把重点放在ADO上,对DAO/RDO不再作升级,所以ADO已经成为了当前数据库开发的主流。 ADO涉及的数据存储有DSN(数据源名称)、ODBC(开放式数据连接)以及OLE DB三种方式。后面的例程将详细讲解这三种方式的具体访问实现。---可以说是对odbc,oledb这些系统级的编程接口的汇接,并对DAO,RDO这些应用级的编程接口的升级吧。

ODBC 、DAO 、ADO 、OLEDB 数据库连接方式区别及联系

ODBC 是一种底层的访问技术,因此,ODBC API 可以是客户应用程序能从底层设置和控制数据库,完成一些高级数据库技术无法完成的功能;但不足之处由于ODBC只能用于关系型数据库,使得利用ODBC很难访问对象数据库及其他非关系数据库。
DAO 提供了一种通过程序代码创建和操纵数据库的机制。最大特点是对MICROSOFT JET数据库的操作很方便,而且是操作JET数据库时性能最好的技术接口之一。并且它并不只能用于访问这种数据库,事实上,通过DAO技术可以访问从文本文件到大型后台数据库等多种数据格式。
ADO是基于OLE DB的访问接口,它是面向对象的OLE DB技术,继承了OLE DB的优点。属于数据库访问的高层接口。

名词解释:

ODBC(Open DataBase Connectivity)开放数据库互联。是由微软主导的数据库链接标准。

MFC(Microsoft Foundation Class)微软基础类。MFC ODBC是对ODBC的封装。

DAO(Data Access Object)数据访问对象。不提供远程访问功能。

RDO(Remote Data Object)远程数据对象。速度快,支持SQL Server存储过程,同DAO一样是发展很多年了的技术。

OLE-DB(Object Linking and Embedding DataBase)对象链接和嵌入数据库。它依赖于COM和提供OLE DB提供者的厂商而非ODBC使用的SQL。

ADO(ActiveX Data Object)ActiveX数据对象。基于OLE-DB建立连接的局部和远程数据库访问技术。同OLE-DB一样要“年轻”些。
使用中,我们一般用OLE-DB和ADO替代DAO和RDO。


ADO和OLEDB之间的关系

OLEDB是一种底层数据访问界面接口。是用于第三方驱动程序商家开发输出数据源到ADO-技术的应用程序或用于C++的开发者开发定制的数据库组件。
OLE DB 是用于访问数据的重要的系统级编程接口,它是 ADO 的基础技术,同时还是 ADO.NET 的数据源。

ADO 是基于OLE DB的访问接口,它是面向对象的OLE DB技术,继承了OLE DB的优点。属于数据库访问的高层接口。

可以这么说,ADO为OLEDB提供高层应用API函数。

 

各种数据接口的连接方式

一、ADO连接
1、连接access数据库
set conn=Server.CreateObject("ADODB.Connection")
conn.open "Driver={Microsoft Access Driver (*.mdb)};dbq="&Server.Mappath("dbname(路径全名)")
2、连接SQL Server数据库
set conn=server.CreateObject("ADODB.Connection")
sql="Driver={SQL Server};server=(local);uid=sa;pwd=sa;database=dbname"
conn.open(sql)

二、ODBC连接(必须先注册数据源---DSN)
(列举配置SQL Server数据库文件DSN,打开管理工具---数据源(ODBC)---打开系统DSN选项卡---单击添加按钮---从列表中选择SQL Server,单击完成---在名称中输入数据库名称,在你想连接的SQL Server服务器中输入(local)---按向导提示完成)
1、连接access数据库
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DSN=注册名"
2、连接SQL Server数据库
set conn=Server.CreateObject("ADODB.Connection")
conn.connectionstring="DSN=注册名;UID=sa;PWD=sa;"
conn.open

三、OLEDB连接数据库
1、连接access数据库
set conn=Server.CreateObject("ADODB.Connection")
conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&server.MapPath("dbname(路径全名)")&";Persist Security Info=False"
set rs=Server.CreateObject("ADODB.Recordset")
2、连接SQL Server数据库
set conn=server.CreateObject("ADODB.Connection")
sql="Provider=SQLOLEDB;data source=(local);initial catalog=dbname;User ID=sa;password=sa;"
conn.open(sql)

 

 

 

参考:

  https://msdn.microsoft.com/en-us/library/ms714562(v=vs.85).aspx

  http://www.cnblogs.com/huzhongzhong/archive/2011/07/12/2104209.html

https://blog.csdn.net/df_xiao/article/details/40511149

关于更详细的ODBC API的信息,可以参考MSDN ODBC Reference。可以在http://msdn.microsoft.com/en-us/library/ms713607(v=vs.85).aspx获得相关文档。

另外编写本文还参考了以下两个文档:

http://msdn.microsoft.com/zh-cn/library/1dwe8111.aspx

http://www.cnblogs.com/kzloser/archive/2012/11/29/2794815.html

posted @ 2019-05-05 20:48  konglingbin  阅读(3201)  评论(0编辑  收藏  举报