【文章內容簡介】
atl產生的模板類3)、在應用中使用產生的數據訪問對象3 不用atl使用ole db數據使用程序利用atl模板產生數據使用程序較為簡單,但適用性不廣,不能動態(tài)適應數據庫的變化。下面我們介紹直接使用mfc ole db類來生成數據使用程序。模板的使用ole db數據使用者模板是由一些模板組成的,包括如下一些模板,下面對一些常用類作一些介紹。1)、會話類 cdatasource類cdatasource類與ole db的數據源對象相對應。這個類代表了ole db數據提供程序和數據源之間的連接。只有當數據源的連接被建立之后,才能產生會話對象,可以調用open來打開數據源的連接。csession類csession所創(chuàng)建的對象代表了一個單獨的數據庫訪問的會話。一個用cdatasource類產生的數據源對象可以創(chuàng)建一個或者多個會話,要在數據源對象上產生一個會話對象,需要調用函數open()來打開。同時,會話對象還可用于創(chuàng)建事務操作。cenumeratoraccessor類cenumeratoraccessor類是用來訪問枚舉器查詢后所產生的行集中可用數據提供程序的信息的訪問器,可提供當前可用的數據提供程序和可見的訪問器。2)、訪問器類 cacessor類caccessor類代表與訪問器的類型。當用戶知道數據庫的類型和結構時,可以使用此類。它支持對一個行集采用多個訪問器,并且,存放數據的緩沖區(qū)是由用戶分配的。cdynamicaccessor類cdynamicaccessor類用來在程序運行時動態(tài)的創(chuàng)建訪問器。當系統(tǒng)運行時,可以動態(tài)地從行集中獲得列的信息,可根據此信息動態(tài)地創(chuàng)建訪問器。cmanualaccessor類cmanualaccessor類中以在程序運行時將列與變量綁定或者是將參數與變量捆定。3)、行集類 crowset類crowset類封裝了行集對象和相應的接口,并且提供了一些方法用于查詢、設置數據等??梢杂胢ove()等函數進行記錄移動,用getdata()函數讀取數據,用insert()、delete()、setdata()來更新數據。cbulkrowset類cbulkrowset類用于在一次調用中取回多個行句柄或者對多個行進行操作。carrayrowset類carrayrowset類提供用數組下標進行數據訪問。4)、命令類 ctable類 ctable類用于對數據庫的簡單訪問,用數據源的名稱得到行集,從而得到數據。cmand類cmand類用于支持命令的數據源??梢杂胦pen()函數來執(zhí)行sql命令,也可以prepare()函數先對命令進行準備,對于支持命令的數據源,可以提高程序的靈活性和健壯性。,加入如下代碼。include extern cmodule _module。include include include // if you are using schema templates 文件里,加入如下代碼。include cmodule _module。決定使用何種類型的存取程序和行集。獲取數據在打開數據源,會話,行集對象后就可以獲取數據了。所獲取的數據類型取決于所用的存取程序,可能需要綁定列。按以下步驟。用正確的命令打開行集對象。如果使用cmanualaccessor,在使用之前與相應列進行綁定。要綁定列,可以用函數getcolumninfo,如下所示: // get the column information ulong ulcolumns= 0。dbcolumninfo* pcolumninfo = null。lpolestr pstrings= null。if(umninfo(amp。ulcolumns, amp。pcolumninfo, amp。pstrings)!= s_ok)afxthrowoledbexception(, iid_icolumnsinfo)。struct mybind* pbind = new mybind[ulcolumns]。accessor(ulcolumns, amp。pbind[0], sizeof(mybind)*ulcolumns)。for(ulong l=0。l用while循環(huán)來取數據。在循環(huán)中,調用movenext來測試光標的返回值是否為s_ok,如下所示: while(xt()== s_ok){// add code to fetch data here// if you are not using an auto accessor, call a()}在while循環(huán)內,可以通過不同的存取程序獲取數據。1)如果使用的是caccessor類,可以通過使用它們的數據成員進行直接訪問。如下所示:2)如果使用的是cdynamicaccessor 或cdynamicparameteraccessor 類,可以通過getvalue或getcolumn函數來獲取數據??梢杂胓ettype來獲取所用數據類型。如下所示: while(xt()== s_ok){// use the dynamic accessor functions to retrieve your// dataulong ulcolumns = umncount()。for(ulong i=0。i{ue(i)。} } 3)如果使用的是cmanualaccessor,可以指定自己的數據成員,綁定它們。就可以直接存取。如下所示: while(xt()== s_ok){// use the data members you specified in the calls to// tf(”%s“, szfoo)。} 決定行集的數據類型在運行時決定數據類型,要用動態(tài)或手工的存取程序。如果用的是手工存取程序,可以用getcolumninfo函數得到行集的列信息。從這里可以得到數據類型。4總結由于現在有多種數據源,想要對這些數據進行訪問管理的唯一途徑就是通過一些同類機制來實現,如ole db。高級ole db結構分成兩部分:客戶和提供者??蛻羰褂糜商峁┱呱傻臄祿>拖衿渌诘亩鄶到Y構一樣,ole db的開發(fā)人員需要實現很多的接口,其中大部分是模板文件。當生成一個客戶對象時,可以通過atl對象向導指向一個數據源而創(chuàng)建一個簡單的客戶。atl對象向導將會檢查數據源并創(chuàng)建數據庫的客戶端代理。從那里,可以通過ole db客戶模板使用標準的瀏覽函數。當生成一個提供者時,向導提供了一個很好的開端,它們僅僅是生成了一個簡單的提供者來列舉某一目錄下的文件。然后,提供者模板包含了ole db支持的完全補充內容。在這種支持下,用戶可以創(chuàng)建ole db提供者,來實現行集定位策略、數據的讀寫以及建立書簽。應用案例:visual c++中使用ole db讀寫sql server 在需要對數據庫進行操作時,ole db總是被認為是一種效率最高但最難的方法。但是以我最近使用ole db的經驗看來,ole db的效率高則高矣,但卻一點都不難。說它難恐怕主要是因為可參考的中文資料太少,為了幫助以后需要接觸ole db的同行,我撰寫了這篇文章。本文包含如下內容:db寫數據庫;