魏平
摘要:數(shù)據(jù)庫是當今計算機軟件應用和開發(fā)最熱門的分支之一,數(shù)據(jù)庫應用程序是指能夠從數(shù)據(jù)庫管理系統(tǒng)DBMS獲取數(shù)據(jù)并進行操作的程序。本文就是研究數(shù)據(jù)庫中特殊數(shù)據(jù)的存取,以Visual C++ 6.0和access 2003環(huán)境下的數(shù)據(jù)庫為例,介紹利用ADO實現(xiàn)對圖像和超長數(shù)據(jù)庫字段的訪問,并在研究生信息管理系統(tǒng)中實現(xiàn)圖像和超長數(shù)據(jù)字段的存取。
關鍵詞:BLOB;VC++;ADO;ACCESS
中圖分類號:G633.67文獻標識碼:A 文章編號:1992-7711(2017)19-092-1
一、Visual C++ 6.0開發(fā)數(shù)據(jù)庫技術的特點
Visual C++ 6.0提供了多種多樣的數(shù)據(jù)庫訪問技術——ODBC API、MFC ODBC、DAO、OLEDB、ADO等。這些技術各有自己的特點,但都提供了簡單、靈活、訪問速度快、可擴展性好的開發(fā)技術。
1.簡單性。Visual C++ 6.0提供了MFC類庫、ATL模板類以及AppWizard、ClassWizard等一系列的Wizard工具,用于幫助程序員快速的建立應用程序,大大簡化了應用程序的設計過程。使用這些技術,只需編寫很少的代碼或不需要編寫代碼就可以開發(fā)一個數(shù)據(jù)庫應用程序。
2.靈活性。Visual C++ 6.0提供的開發(fā)環(huán)境可以使程序員根據(jù)自己的需要設計應用程序的界面和功能,Visual C++ 6.0還提供了豐富的類庫和方法,程序員可以根據(jù)應用程序的特點進行選擇。
3.訪問速度快。為了解決ODBC開發(fā)的數(shù)據(jù)庫應用程序訪問數(shù)據(jù)庫速度慢的問題,Visual C++ 6.0提供了新的訪問技術——OLEDB和ADO,OLEDB和ADO都是基于COM接口的技術,使用這種技術可以直接對數(shù)據(jù)庫的驅(qū)動程序進行訪問,這大大提高了對數(shù)據(jù)庫的訪問速度。
4.可擴展性。Visual C++ 6.0提供了OLE技術和ActiveX技術,這種技術可以增強應用程序的能力。使用OLE技術和ActiveX技術可以使程序員利用Visual C++中提供的各種組件、控件以及第三方程序員提供的組件來創(chuàng)建自己的程序,從而實現(xiàn)應用程序的組件化。使用這種技術可以使應用程序具有良好的可擴展性。
5.訪問不同種類數(shù)據(jù)源。傳統(tǒng)的ODBC技術只能訪問關系型數(shù)據(jù)庫,在Visual C++中,提供了OLEDB訪問技術,不僅可以訪問關系型數(shù)據(jù)庫,還可以訪問非關系型數(shù)據(jù)庫。
二、Visual C++ 6.0 開發(fā)數(shù)據(jù)庫的相關技術
Visual C++ 提供了多種訪問數(shù)據(jù)庫的技術,ODBC(Open DataBase Connectivity)、MFC ODBC(Microsoft Foundation Classes ODBC)、DAO(Data Access Object)、OLEDB(Object Link and Embedding DataBase)、ADO(ActiveX Data Object). 這些技術各有自己的特點。
ADO技術是基于OLE DB的訪問接口,它繼承了OLE DB技術的優(yōu)點。ADO對OLE DB的接口作了封裝,定義了ADO對象,使程序開發(fā)得到了簡化。ADO技術屬于數(shù)據(jù)庫訪問的高層接口。
ADO訪問數(shù)據(jù)源的特點可概括如下:
第一:易于使用,可以說這是ADO最重要的特點之一;第二:可以訪問多種數(shù)據(jù)源;第三:訪問數(shù)據(jù)源效率高;第四:方便地Web應用;第五:技術編程接口豐富。
三、圖片的存取
1.圖片間接存取。間接存取方法并不直接將圖像存入數(shù)據(jù)庫,而是在數(shù)據(jù)表中用專門字段存儲圖像文件的路逕和文件名,圖像則以文件形式存放在指定的目錄下,使用時根據(jù)數(shù)據(jù)庫字段提供的信息找到所需圖像文件并進行加載。
2.圖片直接存取。直接存取方法是將圖像數(shù)據(jù)存儲在數(shù)據(jù)庫關系表中,這樣不僅可以保證圖像數(shù)據(jù)的一致性和安全性,還可以提高圖像數(shù)據(jù)的可用性和可伸縮性。
當前由于大多數(shù)據(jù)庫系統(tǒng)并不提供對圖像數(shù)據(jù)存取的支持,直接存取法的實現(xiàn),須借助第三方開發(fā)工具來完成將圖像從數(shù)據(jù)庫中讀取出來并顯示,或者將圖片保存在數(shù)據(jù)庫中。下面就以Visual C++ 6.0和access 2003環(huán)境下的數(shù)據(jù)庫為例,介紹利用ADO實現(xiàn)對圖像的直接訪問。
3.從數(shù)據(jù)庫中讀出圖像。從數(shù)據(jù)庫讀取圖片時,由于圖片數(shù)據(jù)還不是很大,可以直接使用Field對象的函數(shù)GetChunk()將數(shù)據(jù)庫中的位圖數(shù)據(jù)讀出來,以二進制形式保存在內(nèi)存中,然后將內(nèi)存中的位圖內(nèi)容轉換到HBITMAP,這樣就可以直接顯示了。
四、超長數(shù)據(jù)庫字段的操作方法
在實際的開發(fā)過程中常常需要存儲較大的二進制數(shù)據(jù)對象,如圖像、音頻文件、視頻文件或其他二進制數(shù)據(jù),這些數(shù)據(jù)稱之為二進制大對象BLOB(Binary Large Object),與存取圖片類似,超常數(shù)據(jù)庫字段的訪問也有間接存取和直接存取兩種方法。
1.SafeArray。在對BLOB進行操作時,文件可能很大,需要一次傳遞很多的數(shù)據(jù)時,使用SAFEARRAY就會很方便。SAFEARRAY是一種結構化的數(shù)據(jù)類型,包含了一個由其它數(shù)據(jù)類型的數(shù)據(jù)元素組成的數(shù)組。之所以稱之為安全的數(shù)組是因為它包含了每一維的邊界信息,并限制在邊界內(nèi)進行數(shù)組元素的訪問。
2.將二進制文件寫入到數(shù)據(jù)庫。由于這個二進制文件可能很大,所以無法將所有內(nèi)容一次性讀入到內(nèi)存。我們需要多次讀入,每次可以使用函數(shù)CFile::Read()從文件中讀出一個數(shù)據(jù)包(大小為ChunkSize),然后調(diào)用Field對象的AppendChrnk()函數(shù)將該包讀入數(shù)據(jù)庫。所有過程在一個while循環(huán)中實現(xiàn),直到讀完所有的數(shù)據(jù)。
3.從數(shù)據(jù)庫讀出二進制對象到文件。同樣,由于這個二進制對象可能很大,無法將所有內(nèi)容一次性讀入內(nèi)存中需要多次。每次使用Field對象的GetChunk()函數(shù)讀出一個數(shù)據(jù)包(大小為ChunkSize),然后使用函數(shù)Cfile::Write()將該包寫入文件中,所有過程在一個while循環(huán)中實現(xiàn),直到讀完所有的數(shù)據(jù)。endprint