AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VB编程

创建一个简单的OLE DB提供者

51自学网 http://www.wanshiok.com

用VB6的新的数据觉察类来开发你自己的可以访问任意数据存储的OLE DB提供者.

查看和操纵外部数据源中的数据是VISUAL BASIC的一个最重要功能之一.但它不是总是这样的.VISUAL BASIC最初没有提供内置的对数据库的支持.即使是VISUAL BASIC 3.0也没有提供对数据库的支持,但是可以通过对你的VB3的应用程序升级,使它们也可以使用JET数据库如MICROSOFT ACCESS.在VB6中,微软为我们提供了丰富的数据访问的手段供选择.它们包括:OLE/ADO,关系数据的ODBC,ODBC的RDO,JET数据库的DAO,ODBC数据的DAO(ODBCDirect).微软计划在将来的数据访问将主要依赖OLE DB和ADO,其他的数据访问技术将迟早过时.

OLE DB的部分吸引力,也是ADO对象的对它的要求可以归纳为:”通用数据访问”.OLE DB提供了这么一种技术:它能使你的应用程序找到并读出任意类型的企业数据存储.在本文中的数据存储指的是任意的数据源,包括关系型数据库系统SQL Server和非关系型数据库系统如平面文本文件,电子邮件和消息系统,大型机数据库和目录服务.

你可以通过OLE DB以行和列的方式访问这些数据存储,即使实际的数据并不是以行和列的格式存储的.你能以这样的方式访问数据存储的部分原因是因为OLE DB要求每种类型的数据存储都得有一个OLE DB提供者.一些OLE DB提供者是内置的;其他一些必须单独得到.内置的提供者包括ORACLE的OLE DB提供者,ODBC,JET和SQL Server.每个OLE DB提供者按照OLE DB的规范进行编写:在内部,提供者处理复杂的对各自的数据存储的访问,但在外部,无论它们是何种数据类型,它们的界面都是一样的.该规范使得你无论访问多少种不同的数据源中的数据,所做的方式也都完全是一样的.

在本文中,我们将向你展示如何用VB6的新特性来创建一个简单的OLE DB提供者并如何用这提供者以行和列的格式来存取和修改数据.为简单起见,我们的例子将访问一内存队列,其内容从文本文件中读出的,但你可很容易的把该思想方法扩展到访问其他类型的数据存储.

对旧思想的新转变

你通过构造和定制一个数据觉察类来创建一个OLE DB提供者.使用数据觉察类,你能把访问几乎所有类型的数据的必要的方法,属性和事件都封装起来.

数据觉察类对于VISUAL BASIC 6.0是新的.但是如果你曾用过数据控件来连接数据库的话你就能很好的理解这一思想.就指向数据库并从中取得数据而言,数据觉察类和数据控件的功能是相似的.但数据觉察类它同时起着数据控件和数据绑定控件的作用,但它没有提供一个用户界面.它起的作用决定了它是作为一个数据源还是一个数据使用者.当它是一个数据源时,可把它当作是没有运行时用户界面的数据控件;当它是数据使用者时,把它当成是数据绑定控件,如文本框,只是没有运行时的用户界面而已.使用数据觉察类,可以使你容易的共享数据而不需要在窗体中加入实际的数据控件.

除了提供了用于访问外部数据源的接口外,数据觉察类的的行为跟一个标准的类模块是很相似的.有一个属性—DataSourceBehavior决定了一个类是否是数据觉察的. DataSourceBehavior有三个值:0,1,2.你可以看到这些常量在VB的数据觉察项列表中分别是这样对应的:

vbNone对应0;vbDataSource对应1;vbOLEDBProvider对应2.当DataSourceBehavior属性的值设为0(vbNone)时,这类不是数据觉察的;当属性的值设为1(vbDataSource),类起的是数据源的作用;当属性的值设为2(vbOLEDBProvider)时,类起的是数据源和OLE DB提供者的作用.这项设置仅对公有类有效.

你可以通过另外一个属性—DatbindingBehavior来影响数据觉察类与数据的相互作用.这个属性的可能的值有1和2,分别对应常量vbSimpleBound和vbComplexBound,该属性决定了数据觉察类跟外部数据的绑定方式.简单绑定类只跟一个单一的域绑定;而复杂绑定类则跟整个一组行和列绑定.简单绑定等同与跟文本框绑定,而复杂绑定等同与跟grid控件绑定.

关于OSP

在数据觉察类和数据存储间还存在着OSP(即OLEDBSimpleProvider),它用来解决OLE DB的复杂性.OSP,作为一个界面,要完成如下任务:执行用来进行数据访问的方法;定义查找,刷新,搜索记录的方法.它提供了诸如:getRowCount,getColumnCount,insertRows和deleteRows等方法.在例程中的OSP为简单的数据存储提供服务,它可以在非内存队列中很好的工作.

OSP所指向的记录中的项是用先行后列的方式表示的.如:第一行中的第一个域可用1,1表示.第5行第3列对应的项用5,3表示.OPS保留一些数字具有特殊含义:-1表示一行或列中的所有值.如:-1,2表示2列中的所有项.另外一个保留数是0,它表示数字区外的区域,通常指列的头和行标.

由于你用了OLEDBSimpleProvider界面,所以你还应该包括进OLEDBSimpleProviderListener.它监听着数据的任何改变并通知对象,如OLE DB数据绑定控件,刷新它们的数据. OLEDBSimpleProviderListener提供了描述当前改变过程的状态的方法,如:aboutToChangCell,aboutToDeleteRows,aboutToInertRows,cellChanged,insertedRows,rowsAvailable和transferComplete.

例程中在MyDataSourceproject下有一个数据觉察类模块和一个标准的类模块.MyDataconsumer,一个标准的可执行的工程作为数据使用者,它用的是MyDataSource提供的数据.由于VB6允许你同时加载多个工程到工程管理器中,所以同时加载这两个工程到一个工程组中(见图1).

MyDataSource工程,它作为你的数据源,提供数据给你的数据使用者MyDataConsumer工程.MyDataSource的核心是一个叫MyOLEDBProvider的数据觉察类.(见图2).DataBindingBehavior属性的值置0—vbNone,告诉Visual Basic这个类不是数据使用者.DatasourceBehavior属性置2—vbOLEDBProvider,告诉Visual Basic这个类将会是一个数据源和一个OLE DB提供者.在这工程中,你将对一个简单的数据存储使用一个OLE DB提供者.这个简单的数据存储是存在内存中的阵列.

当你通过设定数据觉察类的属性来创建一个提供者时,你的应用程序访问一个关系型数据库系统跟访问二维的阵列中的数据是相似的.如果那个简单的二维阵列没有提供关系型数据库管理系统(RDBMS)的复杂特性,你一定想知道怎么编写代码使得可以在两种类型的数据存储下有效的工作.换而言之,如果你的应用程序必须在相同的方式下对两者操作,你怎么编写代码既利用了RDBMS的特性,又没有超出简单阵列的能力范围?在编程过程中是否会通过避免使用RDBMS的高级特性而削弱RDBMS的高级特性?一句话,不会.你可以通过使用Microsoft OLE DB Simple Provider 1.5库.

添加一个指向这个库的引用可以让你的应用程序通过OLEDBSimpleProvider界面访问数据,并使得你在如同操作一个复杂的数据存储那样操作简单的的数据存储.OLE DB Simple Provider 1.5对简单的数据存储提供了类似数据库的功能,如find功能用来查找数据,insertRows功能用来插入新数据.添加该应用可以通过MyDataSource 工程|Reference对话框.(见图3).你还应当设置OLE DB Error 库的引用,它提供跟OLE DB有关的错误信息;以及Microsoft Data Source Interfaces的引用,它允许部件作为数据源.

OLEDBSimpleProvider提供了许多在特定事件发生事自动执行的函数.这些事件包括:删除一行,添加一行,改变数据等.过程的名字包括:getRowCount,getColumCount,insertRows和deleteRows.由于OLEDBSimpleProvider无法知道你将要访问的存储类型(e-mail,RDBMS数据库,文件系统等等),它没有内置的知道如何操作所强调的数据的方法.如:从RDBMS数据库系统中删掉一行跟从文本文件中删掉一行是不同的,(即使对于用户来说它们看起来是一样的).所以你得编写自己的过程以实现你将要访问的数据类型的操作.在设定引用以后,你得自己创建一个类,它里面的代码将完成如:getRowCount,getColumCount,insertRows和deleteRows等OLEDBSimpleProvider的过程所要完成的任务.OLEDBSimpleProvider对象提供过程名并保证它们在适当的时候运行.在本文的例程中这个类叫:MyStandardClass.在MyStandardClass的声明部分中应该包括如下声明的语句:

Implements OLEDBSimpleProvider

这个声明的意思是:”嗨,Visual Basic,我在我的工程中引用了这个组件,我将会使用所有内置的跟它相关的方法.但我将决定这些方法在内部是如何工作的.尽管这些组件仍将规定哪些方法是可用的甚至可能会调用它们自身,我会通过对它们重写来规定方法的操作.”

<

 

 

 
上一篇:VB与MS-Draw开发通用作图软件  下一篇:插入对象