国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

用SQL Server為Web瀏覽器提供圖像2

2019-11-18 22:15:44
字體:
供稿:網(wǎng)友
建立ActiveX 動態(tài)鏈接庫

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

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

表A: 在ActiveX動態(tài)鏈接庫里的屬性和方法

屬性/方法                                            作用

DbName                                  打開數(shù)據(jù)庫連接所需的數(shù)據(jù)庫名稱。

TableName,
NameOfImageColumn,                      打開記錄集所需要的信息。
NameOfImageTypeColumn,
NameOfImageIdColumn

ImageFile (只讀)                      把圖片文件的名稱和位置返回給容器。

OpenConnection (方法)                         打開數(shù)據(jù)庫連接。

CreateTemplateImageFile (方法)              從數(shù)據(jù)庫提取圖片數(shù)據(jù),并把它保存到目錄里。


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

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

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

列表 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 '數(shù)組,里面包含文件名和路徑。
Private mlngImageId() As Long '數(shù)組,里面包含圖片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()
'**********************************************************
'作用:打開數(shù)據(jù)庫連接。
'**********************************************************

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
'**********************************************************
'作用:打開記錄集,提取二進(jìn)制數(shù)據(jù),并把數(shù)據(jù)存入文件。注意文件名使用圖片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
     '檢測圖片文件是否已經(jīng)存在。
     If mlngImageId(i) = ImageId Then Exit Sub
  Next i

  mlngNumberOfFiles = mlngNumberOfFiles + 1
  ReDim Preserve mstrFileName(mlngNumberOfFiles) '改變數(shù)組大小。
  ReDim Preserve mlngImageId(mlngNumberOfFiles) '改變數(shù)組大小。
  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   '字節(jié)數(shù)組,用于長的可變二進(jìn)制數(shù)據(jù)LongVarBinary。
Dim strData As String    '字符串,用于長的可變二進(jìn)制數(shù)據(jù)LongVarChar。
Dim DestFileNum As Integer
Dim pic As Variant
Dim i As Integer
'**********************************************************
'作用:提取二進(jìn)制數(shù)據(jù)并把數(shù)據(jù)放入文件。
'輸入:圖片字段,文件名/位置和數(shù)據(jù)尺寸。
'**********************************************************

  If Len(Dir(DiskFile)) > 0 Then '刪除已經(jīng)存在的目標(biāo)文件。
     Kill DiskFile
  End If

  DestFileNum = FreeFile
  Open DiskFile For Binary As DestFileNum
  NumBlocks = FldSize / BLOCKSIZE
  LeftOver = FldSize Mod BLOCKSIZE

  Select Case fld.Type
  Case adLongVarBinary '用于圖片數(shù)據(jù)類型。
     byteData() = fld.GetChunk(LeftOver)
     pic = fld.GetChunk(LeftOver)
     Put DestFileNum, , byteData()

     For i = 1 To NumBlocks
        byteData() = fld.GetChunk(BLOCKSIZE)
        Put DestFileNum, , byteData()
     Next i

  Case adLongVarChar '用于文本數(shù)據(jù)類型。
     For i = 1 To NumBlocks
        strData = String(BLOCKSIZE, 32)
        strData = fld.GetChunk(BLOCKSIZE)
        Put DestFileNum, , strData
     Next i

     strData = String(LeftOver, 32)
     strData = fld.GetChunk(LeftOver)
        Put DestFileNum, , strData
     Case Else
        Err.Clear
        Err.Raise vbObjectError + 22, "Read from DB", "Not a Chunk Required column!"
  End Select

  Close DestFileNum

End Sub

Private Sub HandleError()
Dim adoErrs As ADODB.Errors
Dim errLoop As ADODB.Error
Dim strError As String
Dim i As Integer
'**********************************************************
'作用:處理可能的錯誤。
'**********************************************************

  If mAdoConn.State = adStateClosed Then GoTo Done
   i = 1
   Set adoErrs = mAdoConn.Errors
  For Each errLoop In adoErrs  '枚舉錯誤集。      
     With errLoop
        strError = strError & vbCrLf & "   ADO Error   #" & .Number
        strError = strError & vbCrLf & "   Description  " & .Description
        strError = strError & vbCrLf & "   Source       " & .Source
        i = i + 1
     End With
  Next

Done:
  Err.Raise vbObjectError + 21, "", strError
End Sub

Private Sub Class_Initialize()
  mlngNumberOfFiles = 0
End Sub

Private Sub Class_Terminate()
Dim i As Integer
On Error GoTo Error_handler
   If mAdoRst.State = adStateOpen Then mAdoRst.Close  '關(guān)閉記錄集。      
   If mAdoConn.State = adStateOpen Then mAdoConn.Close  '關(guān)閉連接。
      Set mAdoRst = Nothing
      Set mAdoConn = Nothing
Exit Sub

Error_handler:
  Call HandleError
End Sub

Error_handler:
  Call HandleError
End Sub


下一步是編譯動態(tài)鏈接庫。在文件(File)菜單里,單擊建立(Make) ImageLoader.dll。VB會詢問保存動態(tài)鏈接庫的位
置,然后就編譯項目。在要asp文件里使用ImageLoader.dll這個動態(tài)鏈接庫,必須在Windows注冊表里注冊它。操作方法
是,在NT的啟動菜單里,選擇運(yùn)行(Run),然后在輸入框里輸入下面的命令行:

regsvr32 localpath/ImageLoader
注意,實際使用時要用動態(tài)鏈接庫實際所在的完整路徑替換上面命令行里的“l(fā)ocalpath”?,F(xiàn)在,就可以在程序里,比如
ASP文件里使用這個動態(tài)鏈接庫了。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 东辽县| 中卫市| 光山县| 鹿邑县| 内黄县| 藁城市| 楚雄市| 乌苏市| 华阴市| 隆尧县| 江山市| 宁阳县| 东安县| 理塘县| 酒泉市| 富民县| 大渡口区| 隆昌县| 调兵山市| 分宜县| 山阳县| 桐乡市| 论坛| 百色市| 女性| 安西县| 通渭县| 腾冲县| 阳新县| 衡山县| 西充县| 颍上县| 阿坝县| 双流县| 南涧| 古田县| 马边| 利川市| 岐山县| 台中县| 黔东|