国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

創建一個簡單的OLEDB提供者

2019-11-18 17:49:38
字體:
來源:轉載
供稿:網友
用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提供者來創建數據覺察類.好運!->


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邵阳县| 嵩明县| 新密市| 安远县| 仪征市| 右玉县| 五常市| 武川县| 汉阴县| 奉贤区| 洛宁县| 兖州市| 嵩明县| 汕头市| 安龙县| 炉霍县| 贵港市| 万盛区| 肇东市| 格尔木市| 平和县| 海兴县| 罗甸县| 杭锦旗| 万安县| 师宗县| 呼图壁县| 开封市| 石城县| 阿拉善右旗| 麻江县| 房产| 景宁| 克东县| 虎林市| 福贡县| 怀仁县| 客服| 龙胜| 通城县| 通城县|