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