VB.NET數(shù)據(jù)庫編程中的圖形處理
2024-07-10 13:00:42
供稿:網(wǎng)友
把圖形文件名存入數(shù)據(jù)庫中,這是vb.net數(shù)據(jù)庫編程中處理圖形的一種簡單有效的方法。本文就介紹如何在vb.net中使用這種方法來設(shè)計(jì)windows和web圖形據(jù)庫程序。
關(guān)鍵詞:vb.net,數(shù)據(jù)庫,圖形,windows程序,web程序。
隨著多媒體技術(shù)的發(fā)展,圖形數(shù)據(jù)庫在實(shí)際應(yīng)用中已經(jīng)越來越廣泛了。在vb.net數(shù)據(jù)庫編程中處理圖形的方法之一就是把圖形作為數(shù)據(jù)庫的一個字段存放到數(shù)據(jù)庫中;第二個方法就是把圖形的文件名作為一個字段保存到數(shù)據(jù)庫中,而一張張圖片則作為獨(dú)立的文件放在數(shù)據(jù)庫所在的文件夾中。第一個方法雖然可以較好地保護(hù)圖形文件,但編寫程序比較麻煩并有一定的難度;第二個方法則是處理圖形的一種簡易方法,也是本文要介紹的方法。
1:windows數(shù)據(jù)庫程序中處理圖形的簡易方法
為了說明問題,我們先在access2000中創(chuàng)建一個數(shù)據(jù)庫(假設(shè)其文件名是star.mdb),該數(shù)據(jù)庫中有一個名為star的數(shù)據(jù)表,數(shù)據(jù)表的字段有:編號、姓名、性別、年齡、文件名。程序運(yùn)行如圖1所示,這里你不僅可以瀏覽記錄,還可以編輯、添加、刪除記錄。由于在編輯和添加記錄時要用到圖形的文件名,所以,事先最好把圖形的文件名與該記錄的編號設(shè)成一樣,這樣,操作起來就更方便。
圖1windows程序
圖2 web程序
要實(shí)現(xiàn)圖1所示的功能,我們可以這樣來操作:
①:在vb.net中新建windows 應(yīng)用程序;
②:從"工具箱"的"數(shù)據(jù)"選項(xiàng)卡中,將 oledbdataadapter拖放到窗體上,按屏幕提示建立好數(shù)據(jù)連接,配只置好數(shù)據(jù)適配器。
③:在窗體下面的oledbdataadapter1上單擊鼠標(biāo)右鍵并選擇"生成數(shù)據(jù)集"。
此時在窗體的下面你可以看到三個在程序運(yùn)行時是不可見的控件,它們分別是:oledbdataadapter1、oledbconnection1、dataset11,為了書寫程序時方便,請把它們分別改名為:dba、dbc、ds1。
④:在窗體上添加文本框、圖片框、命令按鈕等控件,并把文本框與數(shù)據(jù)庫中相應(yīng)的字段進(jìn)行綁定,綁定的方法是:在文本框上按f4,出現(xiàn)屬性窗口,選擇該窗口"數(shù)據(jù)"項(xiàng)目下的databindings中的text,此時你可以看到數(shù)據(jù)表中的所有字段,選擇一個字段即可。
完成這些操作之后,我們就要編寫代碼來實(shí)現(xiàn)程序的功能。首先定義一個子程序(假設(shè)其名稱是jth),其功能是顯示當(dāng)前記錄對應(yīng)的圖片:
dim n as integer 'n表示當(dāng)前記錄的位置
sub jth() '自定義的子程序
n = me.bindingcontext(ds1, "star").position 'ds1是數(shù)據(jù)集的名稱
dim str as string
str = "../" + ds1.tables(0).rows(n)("文件名") '文件名是數(shù)據(jù)庫中的一個字段
picturebox1.image = image.fromfile(str)
end sub
窗體裝載事件對應(yīng)的程序是:
me.dbc.connectionstring = "provider=microsoft.jet.oledb.4.0;" & _
"data source=../star.mdb" '用代碼指定數(shù)據(jù)庫的連接
ds1.clear()
dba.fill(ds1, "star") '填充數(shù)據(jù)集
jth()
"下記錄"命令按鈕對應(yīng)的代碼是:
me.bindingcontext(ds1, "star").position += 1
jth()
"上記錄" 命令按鈕對應(yīng)的代碼是:
me.bindingcontext(ds1, "star").position -= 1;
jth()
"首記錄" 命令按鈕對應(yīng)的代碼是:
me.bindingcontext(ds1, "star").position = 0;
jth()
"末記錄"命令按鈕對應(yīng)的代碼是:
me.bindingcontext(ds1,"star").position=me.bindingcontext(ds1,"star").count- 1
jth()
"添加" 命令按鈕對應(yīng)的程序是:
try
me.bindingcontext(ds1, "star").endcurrentedit() '清除當(dāng)前編輯內(nèi)容
me.bindingcontext(ds1, "star").addnew()
picturebox1.image = nothing
catch eendedit as system.exception
system.windows.forms.messagebox.show(eendedit.message)
end try
"刪除"命令按鈕對應(yīng)的程序是:
if (me.bindingcontext(ds1, "star").count > 0) then
me.bindingcontext(ds1, "star").removeat(me.bindingcontext(ds1, "star").position)
end if
添加和刪除操作之后必須單擊"更新"才能真正實(shí)現(xiàn)數(shù)據(jù)庫的更新。"更新"命令按鈕對應(yīng)的程序是:
me.bindingcontext(ds1, "star").endcurrentedit()
dba.update(ds1, "star")
2:web數(shù)據(jù)庫程序中圖形簡易處理的方法
在asp時代,我們可以使用visual interdev6.0來設(shè)計(jì)web程序。在asp.net正在向我們走來的時候,我們則可以使用vb.net來設(shè)計(jì)新一代的web程序(asp.net程序)。雖然可以使用文本編輯器(例如記事本)來編寫asp.net腳本程序,但這種方法對程序人員要求很高,即使是編程高手也往往由于英語單詞拼寫有誤在程序中出現(xiàn)難以查找的錯誤。利用vb.net來設(shè)計(jì)web程序具有代碼少、自動查錯等優(yōu)點(diǎn),這些優(yōu)點(diǎn)對于web程序員來說無疑是一個福音。
圖2所示的就是用vb.net設(shè)計(jì)的一個web程序。這個程序所用的數(shù)據(jù)庫跟上一個程序完全一樣。當(dāng)瀏覽者單擊某個人的姓名時就在右邊顯示他的照片,如果要查看其余的記錄,則可以單擊翻頁鏈接。我們把姓名所在的那一列稱為選擇列。這種程序在網(wǎng)上很常見。要實(shí)現(xiàn)圖2所示的功能,請先在vb.net新建一個asp.net web應(yīng)用程序→把"工具箱""數(shù)據(jù)"選項(xiàng)卡中的oledbdataadapter拖動到窗體上,然后按屏幕提示配置數(shù)據(jù)適配器并生成數(shù)據(jù)集→在窗體上添加顯示數(shù)據(jù)的datagrid,再在datagrid上單擊鼠標(biāo)右鍵并選擇"屬性生成器",出現(xiàn)圖3所示的窗口。選擇圖3中的常規(guī),把數(shù)據(jù)源設(shè)置為窗體中的數(shù)據(jù)集ds1;把數(shù)據(jù)成員設(shè)置為數(shù)據(jù)庫中的數(shù)據(jù)表star;把數(shù)據(jù)鍵字段設(shè)置為數(shù)據(jù)庫中的主鍵(在我們這個數(shù)據(jù)庫中就是"編號"字段)。
圖3 datagrid屬性生成器
為了實(shí)現(xiàn)分頁瀏覽記錄的功能,請選擇圖3中的"分頁",出現(xiàn)圖4所示的窗口。請選擇圖4中的"允許分頁"并確定好每頁的大小(也就是每顯示的行數(shù),例如3行)。選擇"顯示導(dǎo)航按鈕",把頁導(dǎo)航的位置選擇為"底",模式選擇為"頁碼",把數(shù)值按鈕(也就是在每每頁中顯示多少個頁碼鏈接)設(shè)置為一個適當(dāng)?shù)闹担唧w設(shè)置情況見圖4所示。
圖4 datagrid屬性生成器中的分頁功能
現(xiàn)在請選擇圖3中的"列",出現(xiàn)圖5所示的窗口,請把"在運(yùn)行時自動創(chuàng)建列"功能去掉,把"可用列"中的"編號"、"性別"、"年齡"添加到"選定的列"中。再把圖5中"按鈕列"中的"選擇" 添加到"選定的列"中,然后在"文本字段"選擇姓名字段,在"按鈕類型"中選擇"linkbutton",在"頁眉文本"中輸入"姓名",具體設(shè)置情況見圖5所示。
最后,請?jiān)诖绑w上一個用來顯示圖片的image控件(注意是web窗體的image控件)。完成后就要編寫代碼來實(shí)現(xiàn)程序的功能,窗體裝載事件中的代碼是:
dbc.connectionstring = "provider=microsoft.jet.oledb.4.0;data source=" & _
server.mappath("star.mdb") ' dbc是數(shù)據(jù)連接的名稱, star.mdb是數(shù)據(jù)庫
dba.fill(ds1, "star") ' dba和ds1分別是數(shù)據(jù)適配器和數(shù)據(jù)集的名稱,star是數(shù)據(jù)表
if not page.ispostback then
datagrid1.databind()
end if
這里的第一個語句是用來指定數(shù)據(jù)庫連接用的,它可以解決數(shù)據(jù)庫的路徑問題。因?yàn)槲覀冊谂渲脭?shù)據(jù)適配器并建立數(shù)據(jù)連接時是按數(shù)據(jù)庫的絕對路徑來操作的,所以,當(dāng)你把程序拷貝或發(fā)布到別的服務(wù)器(該機(jī)符合asp.net運(yùn)行環(huán)境)上去運(yùn)行的時候很可能就會出現(xiàn)找不到數(shù)據(jù)庫的問題。為了避免這個問題,我們在窗體裝載事件的代碼中加入這個語句。但要注意把數(shù)據(jù)庫與asp.net程序放在同一個web文件夾中。
為了響應(yīng)datagrid的分頁,我們要給datagrid1的pageindexchanged事件加入下列代碼:
datagrid1.currentpageindex = e.newpageindex
datagrid1.databind()
image1.imageurl = nothing '這樣翻頁的時候就不會顯示上一頁中的圖片
圖5 datagrid屬性生成器中的列功能
為了實(shí)現(xiàn)選擇列的功能,我們還要給datagrid1的selectedindexchanged事件編寫下列程序:
dim index as integer
index = datagrid1.selectedindex + (datagrid1.currentpageindex) * 3
dim fname as string
fname = ds1.tables(0).rows(index)("文件名")
image1.imageurl = fname
那么,這樣一個程序能否在其它服務(wù)器上運(yùn)行和調(diào)試呢?這是廣大程序設(shè)計(jì)者非常關(guān)心的問題。要把程序拷貝到其它服務(wù)器上運(yùn)行和調(diào)試,請先在本機(jī)上進(jìn)行編譯,其方法是:選擇"文件"菜單中的"生成并瀏覽",這樣就會在程序所在的web文件夾中的bin 目錄下生成二個擴(kuò)展名為dll的文件。如果僅僅是把程序拷貝到其它服務(wù)器上運(yùn)行,則只要把擴(kuò)展名為aspx的主文件、數(shù)據(jù)庫文件以及bin文件夾一起拷貝到其它服務(wù)器的任何一個虛擬目錄中(或web共享文件夾)就可以了。如果是把程序拷貝到其它服務(wù)器上去調(diào)試,則應(yīng)該把所有相關(guān)的文件都拷貝過去,但虛擬目錄的名稱可以不一樣。
從這里我們也可以看出:asp中煩人的數(shù)據(jù)庫分頁顯示以及圖形的顯示問題,如果用vb.net來設(shè)計(jì),那已經(jīng)是一件很容易的事情了。
以上所有程序都在vb.net+windows 2000下調(diào)試通過。