| 導購 | 订阅 | 在线投稿
分享
 
 
 

用SQLServer爲Web浏覽器提供圖像(三)

來源:互聯網  2008-05-19 04:14:46  評論

建立ActiveX 動態鏈接庫

使用 VB 5.0,我們要開發一個ActiveX 動態鏈接庫。這個動態鏈接庫讓我們能夠連接到SQL數據庫,提取圖片數據,並把它們保存成文件,放在目錄裏。要建立動態鏈接庫,請在打開VB程序之後執行下列步驟:首先:在文件(File)菜單裏,選擇新建項目(New Project)。接著,在新建立項目對話框裏,雙擊ActiveX DLL 圖標。VB自動地向項目裏增加一個類,叫做Class1。然後,在屬性容器裏,雙擊名稱(Name)屬性,把它改成clsImageLoader,保持instancing 屬性爲缺省值MultiUse不動。最後,在項目(Project)菜單裏,選擇Project1 屬性,打開項目屬性對話框。選擇通用(General)選項卡,把項目名稱改爲ImageLoader。其它字段可以不管,保持原樣。單擊確定(OK)完成對ImageLoader 這個工程的設置。

在類裏,寫入了5個Let屬性,1個Get屬性(只讀)和兩個方法。Let屬性傳遞動態鏈接庫需要的信息,Get屬性提供動態鏈接庫生成的圖片文件的位置。兩個方法用來打開到數據庫的連接,以生成圖片文件。表 A 總結了這些屬性和方法的作用。當然,根據項目的需要,可以在類裏加入更複雜的功能。

表A: 在ActiveX動態鏈接庫裏的屬性和方法

屬性/方法

作用

DbName

打開數據庫連接所需的數據庫名稱。

TableName,

NameOfImageColumn,

打開記錄集所需要的信息。

NameOfImageTypeColumn,

NameOfImageIdColumn

ImageFile (只讀)

把圖片文件的名稱和位置返回給容器。

OpenConnection (方法)

打開數據庫連接。

CreateTemplateImageFile (方法)

從數據庫提取圖片數據,並把它保存到目錄裏。

在類裏還有其它的私有子程序,用來初始化類、終止類、打開記錄集、建立圖片文件,以及處理可能的錯誤。

注意微軟活動數據對象ADO1.5(現在爲2.0)被用來連接SQL數據庫。也可以使用其它數據訪問方法,比如遠程數據對象RDO。在這個項目裏,必須使用ADO。操作方法是,單擊項目(Project)菜單,然後選擇引用(References)菜單 項。在引用對話框裏,選中微軟ActiveX Data Objects 1.5 庫,然後單擊確定(OK)。

在列表 B裏,列出了類ImageLoader 完整源代碼。類裏使用的變量定義都在代碼內部給出,還有其它注釋,幫助理解上下文。

列表 B:類 ImageLoader 的完整源代碼

Private mAdoConn As New ADODB.Connection

Private mAdoRst As New ADODB.Recordset

Private mstrDbName As String

Private mstrTableName As String

Private mstrImageColumnName As String '圖片字的名稱。

Private mstrImageTypeColumnName As String '圖片類型字段的名稱。

Private mstrImageIdColumnName As String '圖片ID字段的名稱。

Private mstrFileName() As String '數組,裏面包含文件名和路徑。

Private mlngImageId() As Long '數組,裏面包含圖片ID

Private mlngNumberOfFiles As Long

Const BLOCKSIZE = 102400

Public Property Let DbName(ByVal strVal As String)

mstrDbName = strVal

End Property

Public Property Let TableName(ByVal strVal As String)

mstrTableName = strVal

End Property

Public Property Let NameOfImageColumn(ByVal strVal As String)

mstrImageColumnName = strVal

End Property

Public Property Let NameOfImageTypeColumn(ByVal strVal As String)

mstrImageTypeColumnName = strVal

End Property

Public Property Let NameOfImageIdColumn(ByVal strVal As String)

mstrImageIdColumnName = strVal

End Property

Public Property Get ImageFile(ByVal ImageId As Integer) As String

Dim intPos As Integer

Dim blnFindId As Boolean

Dim i As Integer

blnFindId = False

For i = 0 To mlngNumberOfFiles - 1

If mlngImageId(i) = ImageId Then

intPos = 5 + Len(ImageId) + 3

ImageFile = Right(mstrFileName(i), intPos) 'reformat the location of file.

blnFindId = True

End If

Next i

If blnFindId = False Then

Err.Clear

Err.Raise vbObjectError + 23, "Get ImageFile", "Can't find image file!"

End If

End Property

Public Sub OpenConnection()

'**********************************************************

'作用:打開數據庫連接。

'**********************************************************

On Error GoTo Error_handler

If mstrDbName = "" Then GoTo Error_handler

If mAdoConn.State = adStateOpen Then mAdoConn.Close

mAdoConn.ConnectionString = "DRIVER={SQL Server};SERVER=(local);UID=sa;PWD=;WSID=JIA;DATABASE=" & mstrDbName

mAdoConn.ConnectionTimeout = 15

mAdoConn.Open

Exit Sub

Error_handler:

Call HandleError

End Sub

Public Sub CreateTempImageFile(ByVal ImageId As Integer)

Dim strImageType As String

Dim i As Integer

'**********************************************************

'作用:打開記錄集,提取二進制數據,並把數據存入文件。注意文件名使用圖片ID生成。

'輸入:圖片ID。

'**********************************************************

If mAdoConn.State = adStateClosed Then Exit Sub

Call OpenRecordset(ImageId)

If mAdoRst.State = adStateClosed Then Exit Sub

On Error GoTo Error_handler

For i = 0 To mlngNumberOfFiles - 1

'檢測圖片文件是否已經存在。

If mlngImageId(i) = ImageId Then Exit Sub

Next i

mlngNumberOfFiles = mlngNumberOfFiles + 1

ReDim Preserve mstrFileName(mlngNumberOfFiles) '改變數組大小。

ReDim Preserve mlngImageId(mlngNumberOfFiles) '改變數組大小。

mlngImageId(mlngNumberOfFiles - 1) = ImageId

strImageType = mAdoRst.Fields(mstrImageTypeColumnName) ' 取得圖片類型。

mstrFileName(mlngNumberOfFiles - 1) = App.Path & "images" & _

"image" & LTrim(Str(ImageId)) & "." & strImageType

'取得圖片文件名稱和位置。

Call ReadFromDB(mAdoRst.Fields(mstrImageColumnName), _

mstrFileName(mlngNumberOfFiles - 1), AdoRst.Fields(mstrImageColumnName).ActualSize)

Exit Sub

Error_handler:

Call HandleError

End Sub

Private Sub OpenRecordset(ByVal ImageId As Integer)

Dim SqlText As String

'**********************************************************

'作用:打開記錄集。

'輸入:圖片ID。

'**********************************************************

On Error GoTo Error_handler

If mAdoRst.State = adStateOpen Then mAdoRst.Close

SqlText = "SELECT " & mstrImageColumnName & "," & _

mstrImageTypeColumnName & " FROM " & mstrTableName & _

" WHERE " & mstrImageIdColumnName & "=" & ImageId

Set mAdoRst.ActiveConnection = mAdoConn

mAdoRst.Open SqlText, , adOpenStatic, adLockReadOnly 'Open recordset.

Exit Sub

Error_handler:

Call HandleError

End Sub

Private Sub ReadFromDB(fld As ADODB.Field, ByVal DiskFile As String, _

FldSize As Long)

Dim NumBlocks As Integer

Dim LeftOver As Long

Dim byteData() As Byte

'字節數組,用于長的可變二進制數據LongVarBinary。

Dim strData As String

'字符串,用于長的可變二進制數據LongVarChar。

Dim DestFileNum As Integer

Dim pic As Variant

Dim i As Integer

'**********************************************************

'作用:提取二進制數據並把數據放入文件。

'輸入:圖片字段,文件名/位置和數據尺寸。

'**********************************************************

If Len(Dir(DiskFile)) 0 Then '刪除已經存在的目標文件。

Kill DiskFile

End If

DestFileNum = FreeFile

Open DiskFile For Binary As DestFileNum

NumBlocks = FldSize BLOCKSIZE

LeftOver

  建立ActiveX 動態鏈接庫   使用 VB 5.0,我們要開發一個ActiveX 動態鏈接庫。這個動態鏈接庫讓我們能夠連接到SQL數據庫,提取圖片數據,並把它們保存成文件,放在目錄裏。要建立動態鏈接庫,請在打開VB程序之後執行下列步驟:首先:在文件(File)菜單裏,選擇新建項目(New Project)。接著,在新建立項目對話框裏,雙擊ActiveX DLL 圖標。VB自動地向項目裏增加一個類,叫做Class1。然後,在屬性容器裏,雙擊名稱(Name)屬性,把它改成clsImageLoader,保持instancing 屬性爲缺省值MultiUse不動。最後,在項目(Project)菜單裏,選擇Project1 屬性,打開項目屬性對話框。選擇通用(General)選項卡,把項目名稱改爲ImageLoader。其它字段可以不管,保持原樣。單擊確定(OK)完成對ImageLoader 這個工程的設置。   在類裏,寫入了5個Let屬性,1個Get屬性(只讀)和兩個方法。Let屬性傳遞動態鏈接庫需要的信息,Get屬性提供動態鏈接庫生成的圖片文件的位置。兩個方法用來打開到數據庫的連接,以生成圖片文件。表 A 總結了這些屬性和方法的作用。當然,根據項目的需要,可以在類裏加入更複雜的功能。   表A: 在ActiveX動態鏈接庫裏的屬性和方法   屬性/方法   作用   DbName   打開數據庫連接所需的數據庫名稱。   TableName,   NameOfImageColumn,   打開記錄集所需要的信息。   NameOfImageTypeColumn,   NameOfImageIdColumn   ImageFile (只讀)   把圖片文件的名稱和位置返回給容器。   OpenConnection (方法)   打開數據庫連接。   CreateTemplateImageFile (方法)   從數據庫提取圖片數據,並把它保存到目錄裏。   在類裏還有其它的私有子程序,用來初始化類、終止類、打開記錄集、建立圖片文件,以及處理可能的錯誤。   注意微軟活動數據對象ADO1.5(現在爲2.0)被用來連接SQL數據庫。也可以使用其它數據訪問方法,比如遠程數據對象RDO。在這個項目裏,必須使用ADO。操作方法是,單擊項目(Project)菜單,然後選擇引用(References)菜單 項。在引用對話框裏,選中微軟ActiveX Data Objects 1.5 庫,然後單擊確定(OK)。   在列表 B裏,列出了類ImageLoader 完整源代碼。類裏使用的變量定義都在代碼內部給出,還有其它注釋,幫助理解上下文。   列表 B:類 ImageLoader 的完整源代碼   Private mAdoConn As New ADODB.Connection   Private mAdoRst As New ADODB.Recordset   Private mstrDbName As String   Private mstrTableName As String   Private mstrImageColumnName As String '圖片字的名稱。   Private mstrImageTypeColumnName As String '圖片類型字段的名稱。   Private mstrImageIdColumnName As String '圖片ID字段的名稱。   Private mstrFileName() As String '數組,裏面包含文件名和路徑。   Private mlngImageId() As Long '數組,裏面包含圖片ID   Private mlngNumberOfFiles As Long   Const BLOCKSIZE = 102400   Public Property Let DbName(ByVal strVal As String)   mstrDbName = strVal   End Property   Public Property Let TableName(ByVal strVal As String)   mstrTableName = strVal   End Property   Public Property Let NameOfImageColumn(ByVal strVal As String)   mstrImageColumnName = strVal   End Property   Public Property Let NameOfImageTypeColumn(ByVal strVal As String)   mstrImageTypeColumnName = strVal   End Property   Public Property Let NameOfImageIdColumn(ByVal strVal As String)   mstrImageIdColumnName = strVal   End Property   Public Property Get ImageFile(ByVal ImageId As Integer) As String   Dim intPos As Integer   Dim blnFindId As Boolean   Dim i As Integer   blnFindId = False   For i = 0 To mlngNumberOfFiles - 1   If mlngImageId(i) = ImageId Then   intPos = 5 + Len(ImageId) + 3   ImageFile = Right(mstrFileName(i), intPos) 'reformat the location of file.   blnFindId = True   End If   Next i   If blnFindId = False Then   Err.Clear   Err.Raise vbObjectError + 23, "Get ImageFile", "Can't find image file!"   End If   End Property   Public Sub OpenConnection()   '**********************************************************   '作用:打開數據庫連接。   '**********************************************************   On Error GoTo Error_handler   If mstrDbName = "" Then GoTo Error_handler   If mAdoConn.State = adStateOpen Then mAdoConn.Close   mAdoConn.ConnectionString = "DRIVER={SQL Server};SERVER=(local);UID=sa;PWD=;WSID=JIA;DATABASE=" & mstrDbName   mAdoConn.ConnectionTimeout = 15   mAdoConn.Open   Exit Sub   Error_handler:   Call HandleError   End Sub   Public Sub CreateTempImageFile(ByVal ImageId As Integer)   Dim strImageType As String   Dim i As Integer   '**********************************************************   '作用:打開記錄集,提取二進制數據,並把數據存入文件。注意文件名使用圖片ID生成。   '輸入:圖片ID。   '**********************************************************   If mAdoConn.State = adStateClosed Then Exit Sub   Call OpenRecordset(ImageId)   If mAdoRst.State = adStateClosed Then Exit Sub   On Error GoTo Error_handler   For i = 0 To mlngNumberOfFiles - 1   '檢測圖片文件是否已經存在。   If mlngImageId(i) = ImageId Then Exit Sub   Next i   mlngNumberOfFiles = mlngNumberOfFiles + 1   ReDim Preserve mstrFileName(mlngNumberOfFiles) '改變數組大小。   ReDim Preserve mlngImageId(mlngNumberOfFiles) '改變數組大小。   mlngImageId(mlngNumberOfFiles - 1) = ImageId   strImageType = mAdoRst.Fields(mstrImageTypeColumnName) ' 取得圖片類型。   mstrFileName(mlngNumberOfFiles - 1) = App.Path & "images" & _   "image" & LTrim(Str(ImageId)) & "." & strImageType   '取得圖片文件名稱和位置。   Call ReadFromDB(mAdoRst.Fields(mstrImageColumnName), _   mstrFileName(mlngNumberOfFiles - 1), AdoRst.Fields(mstrImageColumnName).ActualSize)   Exit Sub   Error_handler:   Call HandleError   End Sub   Private Sub OpenRecordset(ByVal ImageId As Integer)   Dim SqlText As String   '**********************************************************   '作用:打開記錄集。   '輸入:圖片ID。   '**********************************************************   On Error GoTo Error_handler   If mAdoRst.State = adStateOpen Then mAdoRst.Close   SqlText = "SELECT " & mstrImageColumnName & "," & _   mstrImageTypeColumnName & " FROM " & mstrTableName & _   " WHERE " & mstrImageIdColumnName & "=" & ImageId   Set mAdoRst.ActiveConnection = mAdoConn   mAdoRst.Open SqlText, , adOpenStatic, adLockReadOnly 'Open recordset.   Exit Sub   Error_handler:   Call HandleError   End Sub   Private Sub ReadFromDB(fld As ADODB.Field, ByVal DiskFile As String, _   FldSize As Long)   Dim NumBlocks As Integer   Dim LeftOver As Long   Dim byteData() As Byte   '字節數組,用于長的可變二進制數據LongVarBinary。   Dim strData As String   '字符串,用于長的可變二進制數據LongVarChar。   Dim DestFileNum As Integer   Dim pic As Variant   Dim i As Integer   '**********************************************************   '作用:提取二進制數據並把數據放入文件。   '輸入:圖片字段,文件名/位置和數據尺寸。   '**********************************************************   If Len(Dir(DiskFile)) 0 Then '刪除已經存在的目標文件。   Kill DiskFile   End If   DestFileNum = FreeFile   Open DiskFile For Binary As DestFileNum   NumBlocks = FldSize BLOCKSIZE   LeftOver      
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有