WEB开发网
开发学院WEB开发综合 创建一个简单的OLEDB提供者 阅读

创建一个简单的OLEDB提供者

 2006-02-27 11:42:58 来源:WEB开发网   
核心提示:用VB6的新的数据觉察类来开发你自己的可以访问任意数据存储的OLEDB提供者.查看和操纵外部数据源中的数据是VISUALBASIC的一个最重要功能之一.但它不是总是这样的.VISUALBASIC最初没有提供内置的对数据库的支持.即使是VISUALBASIC3.0也没有提供对数据库的支持,但是可以通过对你的VB3的应用程
用VB6的新的数据觉察类来开发你自己的可以访问任意数据存储的OLEDB提供者.

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

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

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

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

对旧思想的新转变

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

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

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

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

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

关于OSP

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

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

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

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

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

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

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

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

Implements OLEDBSimpleProvider

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

理解为什么使用Implements声明是件有益的事,假设你将使用一个新的OLEDB控件,如:MicrosoftDataGridControl6.0(OLEDB).如果这个控件跟一个数据觉察类绑定并显示从该类返回的数据.当这控件需要改变自身时,它知道应该调用OLEDBSimpleProvider的getVarient方法.getVarient从特定的数据存储那里返回数据.当用户滚动显示DataGridControl中的新的一行时,它是被自动调用的.通过重写该方法,你可以完全控制怎么有其他数据存储的情况下从特定的数据存储那里返回和提取数据.当你采用这种灵活的方法,你仍将保留自动执行的好处,比如说在数据绑定OLEDB控件删除一行时.此外,你还可以控制行是怎么被删掉的.好处是明显的:在提供者当中的代码仍然在很大程度上保留了对你关联的数据存储类型的无关性.换而言之,由于你用了Implement关键字,OLEDB调用了你的方法,(如deleteRows),并且是你的代码执行这些方法.

如果你仔细的看了例程中的类模块,你将注意到MyStandardClass的DataSourceBehaior属性是置0的.这个类不是数据觉察的,但是其很多代码实际上是对驻留在MyStandardClass中的数据进行操作的.你可以把这些代码包括进MyOLEDBProvider类,但是把这些代码写到它自己的类中是个更好的设计方法,因为这样把应用程序按逻辑功能上进行了分离.当然,从功能上说,无论把这些代码象本例程一样保留在标准模块中还是写到诸如MyOLEDBProvider的数据觉察类中是没有什么分别的.

你也需要在MyStandardClass声明部分加上如下一行以声明一个监听者变量:

DimMyOLEDBSimpleProviderListenerAS_OLEDBSimpleProviderListener

你将用MyOLEDBSimpleProviderListener变量作为事件的驱动器以通知对象如绑定控件,当该变量的值改变时控件将对它们自身进行刷新.如果你记得数据是存储在一个规则的二维阵列中的话,那么这一能力是非常显著的.

为了让监听者工作,你还得创建监听者,存储监听者,并在数据改变时通知监听者.创建监听者用到这个过程:

PrivateSubOLEDBSimpleProvideraddOLEDBSimpleProviderListener(ByValposIListengAsMSDAOSP.OLEDBSimpleProviderListener)

‘添加一个成员到监听者中

‘收集

IfNot(pospIListenerIsNothing)Then

SetMyOLEDBSimpleProvider

Listener=pospIListener

colListener.AddMyOLEDBSimpleProvider_Listener

EndIf

EndSub

当你开始应用程序时OLEDB将自动调用这个过程.而且它将传递一个引用给一个监听者对象(OLEDBSimpleProviderListener).你可以存储该引用并在数据改变的时候使用它.举例说:这代码调用每个OLEDBSimpleProviderListener的deleteRows方法表明有多少行已经被删了:

‘我们已删了上述的行

‘给colListener集中的每个OLEDBSimpleProviderListener发消息

For EachvCurrentListenerIn colListeners

SetMyOSPListener= vCurrentListener

MyOSPListener.deletedRows iRow,cRows

Next

由于MyOLEDBProvider的DataSourceBehavior属性的值是2(vbOLEDBProvider),该类同时作为数据源和OLEDB提供者.设属性的值为1(vbDataSource)或2(vbOLEDBProvider)将使类的过程列表框中自动出现两个额外的事件.DataConnection在数据源跟一个OLEDBSimple提供者连接时被激活.在数据使用者申请一个新的数据源时GetDataMember事件被激活.在这应用程序中,当你将MyOLEDBProvider提供的数据跟OLEDB数据绑定栅格连接时,GetDataMember被激活:

SetDataGrid2.DataSource=MyDataAdapter

这行在主窗体的Form_Load事件过程中执行:

DimMyDataAdapterAsNewDataAdapter

DimMyDataProviderAsNewMyOLEDBProvider

PrivateSubForm_Load()

 Imagel.Picture=LoadPicture(App.Path&“\MyLogo.gif”)

‘设DataAdapter的对象属性为MyOLEDBProvider对象

SetMyDataAdapter.Object=MyDataProvider

‘为栅格设定DataMember属性

DataGride2.DataMember=App.Path&“\Cumtomer.txt”

‘设定DataSource为DataAdapter

SetDataGrid2.DataSource=MyDataAdapter

DisplayCurrentRecords

EndSub

在Form_Load事件过程中,请注意MyDataAdapter.MyDataAdapter是个DataAdapter对象,它的作用是作为OLEDB和OSP的转换层.你得用Project|References对话框为DataConsumer添加指向MicrosoftDataAdapter库的引用(见图4).

这里是GetDataMember事件的过程的代码:

PrivateSubClass_GetDataMember(DataMemberAsString,DataAsObject)

IfLen(DataMember)<lThenDataMember=App.Path&“\Cumtomer.txt”

‘设定sSourceFile属性为DataMember

MySC.sSourceFile=DataMember

‘移植类阵列

MySC.PopulateClassArray

‘设定MySC的数据为MyDataSource的数据

EndSub

DataMember的输入参数是将被绑定的数据的字符串形式的数据成员的名字.在本应用程序中,该字符串包含将要加载到阵列中的文本文件的路径.PopulateClassArray方法完成读取文本文件和把数据拷贝进阵列中的任务.

在不久的将来RDO(远程数据对象)和DAO(数据访问对象)将最终不再使用,ADO将会成熟完善并很快会提供它们的所有功能.作为一个VisualBasic编程者,你应该熟悉OLEDB和ADO的强大的功能和选项.通过这个介绍和例程代码,你应该能够用自己的简单OLEDB提供者来创建数据觉察类.好运!->

Tags:创建 一个 简单

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接