VB實現檔案資料對SQL Server上傳下載
前言
很多單位尤其是製造業、設計院,電腦應用開展的較早。在這些單位,各種法規檔案的下達以及日常工作中產生的大量資料,形成了種類繁雜、數量龐大檔案資料(各種檔案)。面對海量資料,原有檔案管理系統在進行資料的備份、還原、更新與維護時多數已力不從心。傳統的基於檔案的管理方式,還給各種檔案的保密工作帶來了隱患。為此,越來越多的單位開始開發基於資料庫的檔案檔案管理系統,以期克服這些毛病。
結合筆者開發的科技檔案管理系統,本文以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檔案,並且資料量巨大,檔案數目極多,利用本文介紹的方法可以方便的對資料庫各種資料進行查看、上傳、下載操作,方便了有大量檔案資料的單位對資料的管理。