本文以Visual?Basic6.0和SQL?Server?2000環境下的數據庫為例,介紹文件數據對SQL?Server?2000數據庫的上傳和下載。
很多單位尤其是制造業、設計院,計算機應用開展的較早。在這些單位,各種法規文件的下達以及日常工作中產生的大量數據,形成了種類繁雜、數量龐大檔案資料(各種文件)。面對海量數據,原有檔案管理系統在進行數據的備份、還原、更新與維護時多數已力不從心。傳統的基于文件的管理方式,還給各種檔案的保密工作帶來了隱患。為此,越來越多的單位開始開發基于數據庫的文件檔案管理系統,以期克服這些毛病。?
數據庫的連接
對數據庫的操作一定在已經與本地抑或是網絡數據庫建立了聯系的基礎上,建立連接這一需求可以通過兩種方式實現。
為便于理解,這里假定服務器名為Data_Server,檔案數據庫名為Science_File,其中的一個數據表名為office,設計有一個名稱為office、類型為Image的字段,用于保存文件。為便于將不同大小的文件存儲在SQL?Server的數據表中,必須在數據表中創建一個Image型的字段,該字段可存儲的最大文件達2GB字節。
1、利用Adodc控件連接
Visual?Basic提供了一個Adodc控件。它通過Adodc屬性的設置,按照向導提示完成數據庫的連接。具體過程如下:
首先在屬性頁中選擇生成按鈕,進入數據鏈接屬性對話框;然后選擇該對話框中的連接屬性頁,選擇或輸入服務器名稱和數據庫等重要信息;最后測試連接,連接成功后,按確定按鈕,返回到屬性頁對話框,可獲得連接字符串,如下例:
Provider=SQLOLEDB.1;Integrated?Security=SSPI;Persist;Security?Info=False;Initial?Catalog=Science_File;Data?Source=Data_Server?
通過下列語句,即可連接到指定的數據庫:
dim?odbcstr?as?String,?adocon?As?New?ADODB.Connection
odbcstr?=?"Provider=SQLOLEDB.1;Integrated?Security=SSPI;Persist?Security?Info=False;_
Initial?Catalog=Science_File;Data?Source=Data_Server"
adocon.Open?odbcstr?'連接到數據庫?
2、利用NetServerEnum函數
該函數是一個API函數,通過它可獲得一個安裝了SQL?Server數據庫管理系統的服務器列表。方法如下:?
Private?Declare?Function?NetServerEnum?Lib?"netapi32"?_
(lpServer?As?Any,?ByVal?lLevel?As?Long,?vBuffer?As?Any,?_
lPreferedMaxLen?As?Long,?lEntriesRead?As?Long,?lTotalEntries?As?Long,?_
ByVal?lServerType?As?Long,?ByVal?sDomain$,?vResume?As?Any)?As?Long
Private?Declare?Sub?CopyMemory?Lib?"kernel32"?Alias?"RtlMoveMemory"?(Destination?_
As?Any,?Source?As?Any,?ByVal?Length?As?Long)
Private?Declare?Function?lstrlenW?Lib?"kernel32"?(ByVal?lpString?As?Long)?As?Long
Private?Type?SV_100
platform?As?Long
name?As?Long
End?Type
dim?sv100?As?SV_100,?nRet?As?Long,?i?as?long,?lServerInfo?As?Long
dim?lServerInfo?As?Long,?lPreferedMaxLen?As?Long,?lEntriesRead?As?Long
dim?lTotalEntries?As?Long,?sDomain?As?String,?vResume?As?Variant
dim?buffer()?As?Byte,?nLen?As?Long
lPreferedMaxLen?=?65536
nRet?=?NetServerEnum(0,?101,?lServerInfo,?lPreferedMaxLen,?lEntriesRead,?lTotalEntries,?4,?sDomain,?vResume)
If?nRet?=?0?or?nRet?=?234&?Then
For?i?=?0?To?lEntriesRead?-?1
CopyMemory?sv100,?ByVal?lServerInfo,?Len(sv100)
nLen?=?lstrlenW(sv100.name)?*?2?
If?nLen?Then
ReDim?buffer(0?To?(nLen?-?1))?As?Byte
CopyMemory?buffer(0),?ByVal?sv100.name,?nLen
End?If
Combo1.List(i)?=?buffer?'服務器名
lServerInfo?=?lServerInfo?+?24
Next?i
End?If?
得到的服務器名通過Combo1控件顯示,可從中選擇儲存檔案數據的服務器名,再通過下列語句連接到選定服務器中的數據庫:
odbcstr?=?"Provider=SQLOLEDB.1;Integrated?Security=SSPI;Persist?Security?Info=False;_
Initial?Catalog=Science_File;Data?Source="?&?Form2.Combo1.Text
adocon.Open?odbcstr?'連接到數據庫?
其中的變量含義與前述相同,Form2.Combol.Text的內容即為選定的服務器名。
通過以上兩種方法皆可達到連接目的,前者簡潔但有很大局限性,當數據服務器名稱發生變化時,必須修改源代碼,很不方便。后者既有較強的操作性又很直觀。在筆者開發的科技檔案管理系統采用了第二種方法。
數據的上傳
數據的上傳就是將檔案文件存儲到數據表中。在數據上傳時,因情況不同一般有兩種方式,即單一上傳和批量上傳,前者指一次上傳一個文件(在數據表中增加一條記錄),后者指一次將一個文件夾中的所有文件上傳到數據庫。兩者在實質上是統一的,批量上傳時,只需用一個循環語句就可。以下介紹單一上傳的過程。1、打開數據表
通過以下語句打開數據表:
dim?office_rst?As?New?ADODB.Recordset
adocon.CursorLocation?=?adUseClient?
office_rst.Open?"office",?adocon,?adOpenDynamic,?adLockOptimistic,?adCmdTable?
2、添加新記錄并上傳文件
假定通過一些操作已經獲得了要上傳的文件路徑和名稱(例如,可利用CommomDialog控件獲得),保存在string型變量filePath中。上傳的關鍵語句如下:
dim?adofld?As?ADODB.Field,?DataArr()?As?Byte,?filelen?As?Long,?file_num?As?Long
office_rst.AddNew
Set?adofld?=?office_rst("office")
adorst("filename").Value?=?filePath
file_num?=?FreeFile?'返回一個?Integer,代表下一個可供Open語句使用的文件號
Open?filePath?For?Binary?Access?Read?As?file_num?'打開磁盤文件
filelen?=?LOF(file_num)?'求文件長度
ReDim?DataArr(filelen)?'根據文件長度定義動態數組大小
Get?sourcefile,?,?DataArr?'將一個已打開的磁盤文件讀入數組變量之中
adofld.AppendChunk?DataArr()?'將數組內容存入image型字段中
Close?file_num?'關閉磁盤文件
adorst.update?
其中的filename為表office中的一個string型字段,用于存儲檔案文件的名稱。
數據的下載
在完成數據庫連接后不僅可以對數據庫進行文件上傳的操作,還可以很方便的進行下載(瀏覽)。通過Web?Browser控件可瀏覽各種類型的文件。
1、WebBrowser控件
WebBrowser控件使應用程序增加了瀏覽功能,利用它可瀏覽常見的一些文件格式,如Office、CAD、BMP、JEG等。包含了WebBrowser控件的應用程序不僅可以對本機上的文件,還可以對局域網甚至世界網絡范圍內的文件進行瀏覽。
WebBrowse控件有很多方法,但這里只用到了"Navigate"方法,Navigate方法就是通過一個文件的全路徑去訪問這個文件,具體用法為:
WebBrowOff.Navigate?URL
其中WebBrowOff?是一個WebBrowser控件,URL是必需的string型參數,它可以是表示在Internet的WWW服務程序上用于指定信息位置的字符串,也可以是一個全路徑或者是對要瀏覽的文件通過通用命名標準命名的位置和名稱。
2、文件數據的下載
在程序中可利用DataList控件列出數據庫中保存的文件的名稱,下載的思路為:首先定位要下載的文件所在的記錄;然后將文件的內容賦給一個數組,并寫入一個二進制文件;最后將該文件路徑、文件名傳給WebBrowser控件。
關鍵代碼如下所示:
dim?FileArr?()?As?Byte,?current?as?string
filelen?=?office_rst.Fields("office").ActualSize?'得到office字段中的文件數據的大小
ReDim?FileArr(filelen)
FileArr()?=?office_rst.Fields("office").GetChunk(filelen)?'將字段中數據寫入動態數組中
bufferfile?=?FreeFile
Open?"tempfile"?For?Binary?Access?Read?Write?As?bufferfile?'打開一個臨時文件
Put?bufferfile,?,FileArr?'將動態數組FileArr中的數據寫入臨時文件tempfile中
current?=?CurDir?&?"\tempfile"?'獲取臨時文件的全路徑
WebBrowOff.Navigate?current?'在WebBrowser控件中顯示文件內容?
以上代碼中未定義的變量與前述相同。
結束語
現在很多單位檔案資料數據類型繁多,有OFFICE文檔、純文本、圖片資料以及包含基礎地形圖、現狀專題圖、規劃設計成果圖等多種圖件的AUTOCAD文件,并且數據量巨大,文件數目極多,利用本文介紹的方法可以方便的對數據庫各種數據進行查看、上傳、下載操作,方便了有大量檔案資料的單位對資料的管理.?
評論
查看更多