在VB中存取數據庫中的圖片
一、 數據庫的設計
數據庫可以采用微軟的Access97或者SQL Server來進行,首先新建一張表,取名為Table,添加三個字段,分別是:姓名 Char型(SQL Server中)文本型(Access中);編號Char型(SQL Server中)文本型(Access中);照片image型(SQL Server中)OLE對象(Access中),設計好后存盤。為了可以進行遠程調用,我們采用ODBC的方法進行,雙擊打開控制面板里的ODBC數據源,點“系統DSN”選項卡,按“添加”按鈕選擇對應的數據源驅動程序Access的*.mdb或者SQL Server,依照添加向導加添加數據源,下面就可以開始程序的編寫了。
二、 程序的編寫
運行VB,新建一個工程。本程序采用ADO控件和動態鏈接庫訪問數據庫,需要加入ADO的運行庫,單擊“工程引用”菜單,出現引用對話框,選擇Microsoft ActiveX Data Objects2.0 Library并確定。
添加一個Form,四個Label控件,兩個TextBox控件,一個PictureBox控件,一個ADODC控件,三個CommandButton控件,一個CommandDialog控件,如果ADODC和CommandDialog控件沒有出現在工具框上,請單擊菜單“工程部件”。點“控件”選項卡,在其中選中Microsoft ADO Data Control 6.0(OLEDB)和Microsoft Common Dialog Control 6.0兩項按“確定”按鈕。
下面是以上各個控件的一些屬性:
| Form1.MaxButton=False Label1.Caption=姓名: Label2.Caption=編號: Label3.Name= ResName Label3.BackColor= &H80000009& Label3.BorderStyle=1-Fixed Single Label3.DataField=姓名 Label3.DataSource= AdoCtr Label4.Name= ResNumb Label4.BackColor= &H80000009& Label4.BorderStyle=1-Fixed Single Label4.DataField=編號 Label4.DataSource= AdoCtr Text1.Name= Names Text2.Name= Numb CommonDialog1.Name= CDlg Adodc1.Name=AdoCtr CommonButton1.Name=PreView CommonButton1.Caption=預覽 CommonButton2.Name=Save CommonButton2.Caption=保存 CommonButton3.Name= Update CommonButton3.Caption=更新 PictureBox1.Name= PicBox PictureBox1.AutoSize=False PictureBox1.AutoRedraw=False PictureBox1.DataField=照片 PictureBox1.DataSource=AdpCtr |
下面是程序代碼:
′此工程需有Microsoft ActiveX Data Object 2.1 Library(msado15.dll)
Dim Constr As String ′ODBC路徑 Dim FileName As String ′圖片文件名 Const BLOCKSIZE = 4096 ′每次讀寫塊的大小 Dim ADOCon As New ADODB.Connection ′ADODB Connection對象 Dim ADORst As New ADODB.Recordset ′ADODB Recordset 對象 Dim ADOFld As ADODB.Field ′ADODB Field 對象 ------------------------ Private Sub SaveToDB(ByRef Fld As ADODB.Field, DiskFile As String) Dim byteData() As Byte ′定義數據塊數組 Dim NumBlocks As Long ′定義數據塊個數 Dim FileLength As Long ′標識文件長度 Dim LeftOver As Long′定義剩余字節長度 Dim SourceFile As Long ′定義自由文件號 Dim i As Long ′定義循環變量 SourceFile = FreeFile ′提供一個尚未使用的文件號 Open DiskFile For Binary Access Read As SourceFile ′打開文件 FileLength = LOF(SourceFile) ′得到文件長度 If FileLength = 0 Then ′判斷文件是否存在 Close SourceFile MsgBox DiskFile & ″ 無 內 容 或 不 存 在 !″ Else NumBlocks = FileLength BLOCKSIZE ′得到數據塊的個數 LeftOver = FileLength Mod BLOCKSIZE ′得到剩余字節數 Fld.Value = Null ReDim byteData(BLOCKSIZE) ′重新定義數據塊的大小 For i = 1 To NumBlocks Get SourceFile, , byteData() ′ 讀到內存塊中 Fld.AppendChunk byteData() ′寫入FLD Next i ReDim byteData(LeftOver) ′重新定義數據塊的大小 Get SourceFile, , byteData() ′讀到內存塊中 Fld.AppendChunk byteData() ′寫入FLD Close SourceFile ′關閉源文件 End If End Sub |
----------------------
Private Sub Form_Load() Constr = ″DSN=image″ ′定義ODBC連接 ADOCon.Open Constr ′創建一個連接 ADORst.Open ″table″, ADOCon, adOpenDynamic, adLockOptimistic ′打開一個ADO動態集 表名為table Set AdoCtr.Recordset = ADORst ′將動態集賦給ADO控件 End Sub |
----------------------
Private Sub Form_Unload(Cancel As Integer) ′記得關閉打開的數據集,釋放資源 ADORst.Close ADOCon.Close Set ADORst = Nothing Set ADOCon = Nothing End Sub |
----------------------
| Private Sub PreView_Click() ′顯示打開文件的公用對話框,選擇需要加入數據庫的圖片 CDlg.Filter = ″位圖(*.bmp)|*.bmp″ CDlg.ShowOpen FileName = CDlg.FileName PicBox.Picture = LoadPicture(FileName) ′預覽圖片 End Sub |
----------------------
| Private Sub Save_Click() ADORst.AddNew ′新增紀錄 ADORst(″姓名″).Value = Names.Text ′給動態集的第一個字段賦值 ADORst(″編號″).Value = Numb.Text ′給動態集的第二個字段賦值 Set ADOFld = ADORst(″照片″) ′給ADODB.Field對象賦值 Call SaveToDB(ADOFld, FileName) ′調用子程序,給第三個字段(image)賦值 ADORst.Update End Sub |
----------------------
| Private Sub Update_Click() ′重新打開紀錄集,刷新紀錄 ADORst.Close ADOCon.Close Set ADORst = Nothing Set ADOCon = Nothing ADOCon.Open Constr ADORst.Open ″table″, ADOCon, adOpenDynamic, adLockOptimistic Set AdoCtr.Recordset = ADORst End Sub |
本程序在VB6.0/Windows98/WindowsNT下編譯通過。