用VB.NET開發圖形數據庫。本站提示廣大學習愛好者:(用VB.NET開發圖形數據庫)文章只能為提供參考,不一定能成為您想要的結果。以下是用VB.NET開發圖形數據庫正文
1引言
隨著計算機的普及,數據庫使用順序越來越失掉普遍的使用,帶圖像的數據庫使用順序已成了數據庫使用順序不可短少的一局部,如何將圖像信息存儲到數據庫中、如何用開發工具完成對圖形數據庫的存取等問題已成順序設計者必需處理的問題,如何處理上述問題就成了本文討論的重點。
2在Access數據庫中存儲圖像信息的辦法
在Access數據庫中存儲圖像的辦法很多,例如:用OLE對象存儲圖像信息和用文本存儲圖像信息等,其中用OLE對象存儲圖像信息是將圖像嵌入到數據庫中,這樣的益處是當數據庫或許原來圖像的地位發作變化時順序不需求做特殊的處置,但用OLE對象存儲圖像信息的數據庫會隨著圖像的增多運轉速度逐步變慢並且占用的存儲空間急劇增大,而用文本存儲圖像信息是用文本字段寄存圖像的文件名,並將數據庫中用到的圖像寄存到指定的文件夾中,這種辦法的益處是數據庫占用的存儲空間小並且運轉速度快。
3用VB.NET對圖片信息停止存取的辦法
為了引見上述辦法的完成,自己先在Access中辨別樹立了名為DataBase1.mdb和DataBase2.mdb的學生信息數據庫,數據庫中都有一個名為Information表,其中一個包括了名為name的文本型字段和名為picture的OLE對象型字段,另一個包括了名為name和picture的兩個文本型字段。然後在VB.NET中設計一個如圖1所示的窗體,並添加一個名為OpenFileDialog1的OpenFileDialog控件。
圖1 窗體的設計界面
3.1用OLE對象存儲圖片信息
3.1.1總的設計思緒
運用OLE對象存儲圖片信息最關鍵的問題就是如何將PictureBox控件中的圖像信息與OLE對象型字段的內容關聯起來,這裡可以思索將PictureBox對象中的圖像文件讀成內存流,用SQL語句拔出或更新到OLE對象字段中以二進制方式存儲,當從數據庫中讀取該字段時,將PictureBox對象的圖像源設置為來自內存流。
3.1.2代碼完成
(1)引入命名空間。由於在順序中用到MemoryStream類和與Access數據庫操作相關的類,所以在順序一開端的中央參加以下兩個語句引入命名空間:
Imports System.io
Imports System.Data.OleDb
(2)創立銜接字符串。用Dim OleDbConnection1 As New OleDbConnection語句創立一個窗體級變量,在窗體的Load事情中設置銜接字符串:OleDbConnection1.ConnectionString = "Data Source=""(數據庫的寄存途徑)"";Provider=""Microsoft.Jet.OLEDB.4.0"""
(3)為“上傳相片”按鈕添加代碼。當點擊“上傳相片”按鈕時彈出翻開文件對話框,將在翻開文件對話框中選中的圖片文件作為PictureBox對象的圖像源,相關代碼如下所示:
If Me.OpenFileDialog1.ShowDialog() = DialogResult.OK Then
picPicture.Image = Image.FromFile(Me.OpenFileDialog1.FileName)
End If
(4)將pictureBox對象中的圖像信息轉換成無符號的字節數組。先用Save辦法將PictureBox對象中的圖像信息保管到內存流對象TempMemoryStream中,然後用TempMemoryStream對象的GetBuffer辦法前往從其創立此流的無符號字節數組。
Private Function GetImage() As Byte()
Dim TempMemoryStream As New MemoryStream
picPicture.Image.Save(TempMemoryStream, picPicture.Image.RawFormat)
Dim TempImage() As Byte = TempMemoryStream.GetBuffer
TempMemoryStream.Close()
Return TempImage
End Function
(5)將OLE對象字段的內容顯示在PictureBox控件中。先用CType函數將OLE對象字段的值轉化為字節數組類型,然後用上述所失掉的字節數組作為MemoryStream類結構函數的參數來創立MemoryStream對象,最後將PictureBox對象的圖像源設置為來源於內存流,相關代碼如下所示:
Dim arrPicture() As Byte = CType(InformationTable.Rows(i)("picture"), Byte())
Dim TempMemoryStream As New MemoryStream(arrPicture)
picPicture.Image = Image.FromStream(TempMemoryStream)
(6)為拔出、添加和刪除按鈕添加代碼。拔出、添加和刪除這三個模塊的設計思緒根本分歧:先創立一個OleDbCommand對象,然後設置 OleDbCommand對象要銜接的數據源和執行的SQL語句,最後調用ExecuteNonQuery辦法執行SQL語句。由於三個模塊的代碼類似,上面只引見拔出按鈕的代碼:
Dim InsertCommand As New OleDbCommand
InsertCommand.Connection = OleDbConnection1
InsertCommand.CommandText = "insert into information(name,picture) values(@Name,@Picture)"
InsertCommand.Parameters.Add("@Name", OleDb.OleDbType.VarChar, 0, "name")
InsertCommand.Parameters.Add("@Picture", OleDb.OleDbType.VarBinary, 0, "picture")
InsertCommand.Parameters("@Name").Value = txtName.Text
InsertCommand.Parameters("@Picture").Value = GetImage()
OleDbConnection1.Open()
InsertCommand.ExecuteNonQuery()
OleDbConnection1.Close()
3.2用文本存儲圖片信息
3.2.1總的設計思緒
用文本存儲圖片信息是在存儲圖像時只將圖像文件的文件名保管在數據庫中,並將圖像文件寄存到指定的文件夾(picture文件夾)下,當閱讀記載時將指定文件夾下對應文件名的圖像顯示在PictureBox控件中。
在設計時我們應該留意:本順序模仿的是一個學生信息零碎,一條記載對應一個圖像文件,為了防止指定文件夾寄存多余的圖像文件,在一開端數據庫為空時指定文件夾也沒有任何文件,當添加或修正記載時才將對應的圖像文件拷貝到指定文件夾中,當修正或刪除記載時也應該刪除不需求的圖像文件。
3.2.2代碼完成
(1)引入命名空間。由於在順序中用到與Access數據庫操作相關的類和File類,所以在順序一開端的中央參加以下語句引入命名空間:
Imports System.Data.OleDb
Imports System.io
(2)為窗體的Load事情添加代碼。先獲取以後順序的運轉途徑和picture文件夾的途徑,然後創立與數據庫的關聯,將相關數據從數據源提取到DataSet中,最後在窗體中顯示數據庫的內容。局部代碼如下:
Dim CurrentPath As String = Directory.GetCurrentDirectory'獲取以後順序的運轉途徑
Path = CurrentPath + "picture" '獲取文件夾picture對應的途徑
OleDbConnection1.ConnectionString = "Data Source=""(數據庫的寄存途徑)"";Provider=""Microsoft.Jet.OLEDB.4.0"""
OleDbConnection1.Open()
Dim SelectCommand As New OleDbCommand("select * from Information", OleDbConnection1)
OleDataAdapter1.SelectCommand = SelectCommand
OleDataAdapter1.Fill(DataSet1, "Information")'將滿足下面查詢條件的內容填充到DataSet1中
OleDbConnection1.Close()
ShowFirstRecord()'顯示第一條記載
(4)為“上傳相片”按鈕添加代碼。將在翻開文件對話框中選中的圖片文件作為PictureBox對象的圖像源,同時獲取該圖片文件的文件名和寄存途徑。
獲取在翻開文件對話框中選中的文件名的局部代碼如下所示:
index = Me.OpenFileDialog1.FileName.LastIndexOf("")' index寄存文件途徑中最後一個""的地位
FileNameLength = Me.OpenFileDialog1.FileName.Length - index - 1 ' FileNameLength寄存文件名的長度
PictureFileName = Me.OpenFileDialog1.FileName.Substring(index + 1, FileNameLength) ' PictureFileName寄存在翻開文件對話框中選中的文件的文件名
獲取在翻開文件對話框中選中的文件的途徑(不包括文件名)的代碼如下所示:
NewPictureFilePath = Me.OpenFileDialog1.FileName.Substring(0, OpenFileDialog1.FileName.Length - FileNameLength)
(5)為“拔出記載”按鈕添加代碼。先將要拔出的圖片文件拷貝到指定的文件夾下,假如要拔出的圖片曾經寄存在指定文件夾下則不需求拷貝,假如新拔出的圖片文件名在指定文件夾中曾經存在,則應該對新拔出的圖片重新命名;然後將新建的記載添加到表中並更新數據源;最後顯示第一條記載。相關代碼如下所示:
'1)假如在翻開文件對話框中選中的文件的途徑與picture文件夾的途徑不同,則將在翻開文件對話中選中的圖片拷貝到文件夾picture中
If NewPictureFilePath.CompareTo(Path) <> 0 Then
Dim OldPictureFileName As String = NewPictureFileName '將選中的圖片的文件名存在OldPictureFileName中
'假如選中的圖片文件名與picture文件夾中的圖片名相反,請重新命名
While File.Exists(Path + NewPictureFileName)
NewPictureFileName = InputBox("你選擇的圖片文件名在'picture'文件夾中已存在,請在上面文本框中重新命名該圖片文件,文件名要求包括後綴名,如1.jpg", "提示")
End While
'將在翻開文件對話中選中的圖片拷貝到文件夾picture中
File.Copy(NewPictureFilePath + OldPictureFileName, Path + NewPictureFileName)
End If
'2)將記載拔出到表中
Dim InsertCommand As New OleDbCommand
InsertCommand.Connection = OleDbConnection1
InsertCommand.CommandText = "insert into information2(name,picture) values(@Name,@Picture)"
InsertCommand.Parameters.Add("@Name", OleDb.OleDbType.VarChar, 0, "name")
InsertCommand.Parameters.Add("@Picture", OleDb.OleDbType.VarChar, 0, "picture")
InsertCommand.Parameters("@Name").Value = txtName.Text
InsertCommand.Parameters("@Picture").Value = NewPictureFileName
OleDbConnection1.Open()
InsertCommand.ExecuteNonQuery()
OleDbConnection1.Close()
'3)顯示第一條記載,目的是更新數據集
ShowFirstRecord()
(6)為“刪除記載”按鈕添加代碼。先刪除picture文件夾中對應的圖片文件,然後刪除以後記載並更新數據源,最後顯示第一條記載。局部代碼如下所示:
'1)刪除picture文件夾中對應的相片(假定一張相片只對應一條記載) picPicture.Image.Dispose() '釋放picPicture控件image中的一切資源
File.Delete(Path + PictureFileName)
'2)刪除以後記載
Dim DeleteCommand As New OleDbCommand
DeleteCommand.Connection = OleDbConnection1
DeleteCommand.CommandText = "delete from information2 where name=@Name and picture=@Picture"
DeleteCommand.Parameters.Add("@Name", OleDb.OleDbType.VarChar, 0, "name")
DeleteCommand.Parameters.Add("@Picture", OleDb.OleDbType.VarChar, 0, "picture")
DeleteCommand.Parameters("@Name").Value = txtName.Text
DeleteCommand.Parameters("@Picture").Value = PictureFileName
OleDbConnection1.Open()
DeleteCommand.ExecuteNonQuery()
OleDbConnection1.Close()
'3)顯示第一條記載,目的是更新數據集
ShowFirstRecord()
(7)為“修正記載”按鈕添加代碼。假如修正前和修正後的圖片不一樣,則刪除原有圖片,將新的圖片拷貝到指定目錄上,然後修正記載並更新數據源。局部代碼如下所示:
'1)假如修正前和修正後的圖片不一樣,則刪除原有圖片
If (NewPictureFilePath + NewPictureFileName).CompareTo(Path + PictureFileName) <> 0 Then
picPicture.Image.Dispose()
File.Delete(Path + PictureFileName)
End If
'2)假如在翻開文件對話框中選中的文件的途徑與picture文件夾的途徑不同,則將在翻開文件對話中選中的圖片拷貝到文件夾picture中,代碼與“拔出記載”的代碼相反,這裡省略。
'3)修正記載
Dim ChangeCommand As New OleDbCommand
ChangeCommand.Connection = OleDbConnection1
ChangeCommand.CommandText = "update information2 set name=@Name,picture=@Picture where 編號=@Id"
ChangeCommand.Parameters.Add("@Name", OleDb.OleDbType.VarChar, 0, "name")
ChangeCommand.Parameters.Add("@Picture", OleDb.OleDbType.VarChar, 0, "picture")
ChangeCommand.Parameters.Add("@Id", OleDb.OleDbType.Integer, 0, "編號")
ChangeCommand.Parameters("@Name").Value = txtName.Text
ChangeCommand.Parameters("@Picture").Value = NewPictureFileName
ChangeCommand.Parameters("@Id").Value = id
OleDbConnection1.Open()
ChangeCommand.ExecuteNonQuery()
OleDbConnection1.Close()
'4)顯示第一條記載,目的是更新數據集
ShowFirstRecord()
4小結
從順序的測試後果看,當兩個數據庫都存儲相反的信息時,用OLE對象存儲圖像信息的數據庫所占的存儲空間是用文本存儲圖像信息的數據庫和寄存圖像的picture文件夾所占的存儲空間之和的一倍,並且對用OLE對象存儲圖像信息的數據庫停止訪問的時間很大水平是由圖像的大小決議,圖像越大訪問時間越長,而對用文本存儲圖像信息的數據庫中的不同圖像大小的記載停止訪問的時間根本都相反,並且比前者快得多。因而,從數據占用的存儲空間和對數據庫的訪問效率上看,第二種辦法的優勢更大。