【摘 要】本文詳細介紹并使用了基于VC6.0的開發(fā)技術。使學員掌握如何在ACCESS數(shù)據(jù)庫中存取大二進制數(shù)據(jù)。我們以.BMP格式的圖片的存取為例。簡單的介紹了存取的方法。
【關鍵詞】二進制對;ADO;存儲結構
1.ORACLE數(shù)據(jù)庫簡介
Oracle數(shù)據(jù)庫是以高級結構化查詢語言(SQL)為基礎的大型關系數(shù)據(jù)庫。通俗地講,它使用方便邏輯管理的語言操縱大量有規(guī)律數(shù)據(jù)的集合,是目前最流行的服務器/客戶機體系的數(shù)據(jù)庫之一。
1.1 Oracle 的特點
Oracle7.x以來引入共享SQL和多線索服務器體系結構。這減少了Oracle的資源占用,增強了Oracle的能力,使之在低檔軟硬件平臺上用較少的資源就可以支持更多的用戶而在高檔的平臺上可以支持成百上千個用戶。
提供了基于角色(Role)分工的安全保密管理。在數(shù)據(jù)庫管理功能,完整性檢查,安全性,一直性方面都有良好的表現(xiàn)。
提供了與第三代高級語言的接口軟件PRO*系列,能在C,C++等主語言中嵌入SQL語句及過程化(PL/SQL)語句對數(shù)據(jù)庫中的數(shù)據(jù)進行操作。
1.2 Oracle 的存儲結構
物理結構。Oracle數(shù)據(jù)庫在物理上是存儲于硬盤的各種文件,它是活動的,可擴充的,它隨著數(shù)據(jù)的添加和應用程序的增大而變化。
邏輯結構。Oracle 數(shù)據(jù)庫在邏輯上是由許多表空間組成的。主要分為系統(tǒng)表空間和非系統(tǒng)表空間。非系統(tǒng)表空間內存儲著各項應用的數(shù),索引,程序等相關信息。要建立較大的Oracle 應用系統(tǒng)時,應先創(chuàng)建它所獨占的表空間,同時定義物理文件的存放路徑和所占硬盤的大小。
Oracle以穩(wěn)定并適合作為大型應用的數(shù)據(jù)庫平臺而著稱。 但他的可操作性不強,不是和中小型應用軟件系統(tǒng)。一般不選擇為小型應用數(shù)據(jù)庫平臺。
1.3 BLOB的起源
數(shù)據(jù)庫在當今的應用越來越廣泛了,同樣伴隨著領域的廣泛,存儲的內容也不在是只有數(shù)值、字符、boolean幾種類型,而是越來越多樣化。在這樣的前提下就出現(xiàn)了Blob類型。
Blob是指二進制大二進制對象也就是英文Binary Large Object的所寫,由此可見這個類型都是用來存儲大量數(shù)據(jù)而設計的,BLOB是用來存儲大量二進制數(shù)據(jù)的。
1.4 BLOB的概述
1.4.1大對象類型概述
大對象類型BLOB全稱為Binary Large Objects,即二進制大對象。可以把BLOB區(qū)別為三種形式:聲像數(shù)據(jù)、二進制數(shù)據(jù)和大文本數(shù)據(jù)。因此,最常見的應用就是存儲圖形、聲音等對象,此外,大二進制對象、OLE對象也可以通過BLOB類型存入數(shù)據(jù)庫,如果文本對象過大,超出了文本類型的規(guī)定長度,則必須用BLOB字段進行存儲。我們在經(jīng)常使用的編程環(huán)境中并不能直接支持BLOB字段,因此需要調用相應的函數(shù)完成BLOB的使用。不同的數(shù)據(jù)庫系統(tǒng)對大二進制對象類型的支持不同,常用數(shù)據(jù)庫系統(tǒng)支持的大二進制對象數(shù)據(jù)類型。
1.4.2大二進制對象的存取方法
(1)利用MFC提供的CLongBinary類。VC存取大二進制對象數(shù)據(jù)有眾多方法,如OLE、ActiveX等,而VC的MFC提供的CLongBinary類可以方便地實現(xiàn)存取BLOB字段。使用CLongBinary類可以存取超過MAXINT數(shù)目的數(shù)據(jù),最大為可以得到的內存容量。但數(shù)據(jù)完全保存在內存中,對超大量數(shù)據(jù)消耗太大。
(2)利用ODBC的SQLGetData和SQLPutData函數(shù)。對于不能存儲在單一緩沖區(qū)中的數(shù)據(jù),在行中的其他數(shù)據(jù)已被獲取之后,可以直接用SQLGetData分批從驅動程序檢索這些數(shù)據(jù)。為了從一列檢索長數(shù)據(jù),應用程序首先調用SQLFetchScroll或SQLFetch移動一行,并且調用SQLGetData獲取綁定列的數(shù)據(jù)。SQLPutData允許在應用程序語句執(zhí)行時,把參數(shù)或字段送到驅動程序。該函數(shù)用來把字符或二進制數(shù)值送到字符、二進制或數(shù)據(jù)源指定類型的字段。它可以傳遞任何類型的數(shù)據(jù),但對字符和二進制數(shù)據(jù)可傳遞部分數(shù)據(jù)、綁定緩沖區(qū)并讓驅動器從緩沖區(qū)中檢索數(shù)據(jù)。
(3)使用ADO存取BLOB數(shù)據(jù)。
可以使用ADO中的AppendChunk函數(shù)來存取BLOB數(shù)據(jù)。AppendChunk包含在Field對象中,原型如下:HRESULT AppendChunk (const_variant_t Data );從函數(shù)原型中可以看到關鍵的問題是需把二進制數(shù)據(jù)賦值給VARIANT類型的變量。對應于保存數(shù)據(jù)時我們所使用的AppendChunk函數(shù),讀取數(shù)據(jù)應該使用GetChunk函數(shù),GetChunk的原型如下:_variant_t GetChunk (long Length );給出數(shù)據(jù)的長度后GetChunk將返回包含數(shù)據(jù)的VARIANT類型變量,然后我們可以利用SafeArrayAccessData函數(shù)得到VARIANT變量中指向數(shù)據(jù)的char *類型的指針,以方便處理。
1.4.3數(shù)據(jù)轉換過程中大二進制對象處理方法
在數(shù)據(jù)轉換中,首先取出源數(shù)據(jù)源的元數(shù)據(jù),判斷源數(shù)據(jù)源和目的數(shù)據(jù)源中是否存在字段為大二進制對象的類型。對于源數(shù)據(jù)源中的每個大二進制對象字段的數(shù)據(jù),選擇相應的大二進制對象讀取方法,把此大二進制對象數(shù)據(jù)取出后保留在一個臨時文件中,然后在目的數(shù)據(jù)庫插入數(shù)據(jù),遇到大二進制對象字段時,選擇相應的大二進制對象存取方法,再從臨時文件中依次讀出數(shù)據(jù)插入到指定字段中。
2.什么是ADO
ADO是ActiveX數(shù)據(jù)對象(ActiveX Data Object),這是Microsoft開發(fā)數(shù)據(jù)庫應用程序的面向對象的新接口。ADO訪問數(shù)據(jù)庫是通過訪問OLE DB數(shù)據(jù)提供程序來進行的,提供了一種對OLE DB數(shù)據(jù)提供程序的簡單高層訪問接口。ADO技術簡化了OLE DB的操作,OLE DB的程序中使用了大量的COM接口,而ADO封裝了這些接口。所以,ADO是一種高層的訪問技術。
2.1 ADO的對象
ADO是目Microsoft通用的數(shù)據(jù)庫訪問技術。ADO編程模型定義一組對象,ADO對象模型包含9個對象:Connection,Recordset,Record, Command,Parameter,F(xiàn)ield,Property,Stream和Error.
2.2該程序主要用到的4個對象
Connection對象
2.3說明
Connection 對象代表與數(shù)據(jù)源進行的唯一會話。如果是客戶端/服務器數(shù)據(jù)庫系統(tǒng),該對象可以等價于到服務器的實際網(wǎng)絡連接。取決于提供者所支持的功能,Connection 對象的某些集合、方法或屬性有可能無效。
2.4 Error對象
Error 對象包含與單個操作(涉及提供者)有關的數(shù)據(jù)訪問錯誤的詳細信息。
3.說明
任何涉及 ADO 對象的操作都會生成一個或多個提供者錯誤。每個錯誤出現(xiàn)時,一個或多個 Error 對象將被放到 Connection 對象的 Errors 集合中。當另一個 ADO 操作產(chǎn)生錯誤時,Errors 集合將被清空,并在其中放入新的 Error 對象集。