亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 22:15:44
字體:
來源:轉載
供稿:網友
建立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 = FldSize Mod BLOCKSIZE

  Select Case fld.Type
  Case adLongVarBinary '用于圖片數據類型。
     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 '用于文本數據類型。
     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  '關閉記錄集。      
   If mAdoConn.State = adStateOpen Then mAdoConn.Close  '關閉連接。
      Set mAdoRst = Nothing
      Set mAdoConn = Nothing
Exit Sub

Error_handler:
  Call HandleError
End Sub

Error_handler:
  Call HandleError
End Sub


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

regsvr32 localpath/ImageLoader
注意,實際使用時要用動態鏈接庫實際所在的完整路徑替換上面命令行里的“localpath”。現在,就可以在程序里,比如
ASP文件里使用這個動態鏈接庫了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久青草国产97香蕉在线视频| 久久天堂电影网| 日韩在线视频导航| 51ⅴ精品国产91久久久久久| 国产精品久久久久久婷婷天堂| 亚洲精品有码在线| 亚洲国产精品人人爽夜夜爽| 国产日韩精品一区二区| 中文字幕av一区中文字幕天堂| 精品日本高清在线播放| 国产99视频在线观看| 日韩av在线一区| 欧美极品少妇xxxxⅹ免费视频| 日韩中文字幕视频在线观看| 欧美巨猛xxxx猛交黑人97人| 成人a在线视频| 亚洲成人三级在线| 日韩av片免费在线观看| 亚洲精品mp4| 欧美中文在线观看国产| 中文字幕欧美日韩精品| 日韩不卡中文字幕| 欧美丰满片xxx777| 色妞色视频一区二区三区四区| 亚洲精品永久免费| 欧美激情一区二区三区久久久| 国产精品偷伦视频免费观看国产| 国产精品久久久久久久久粉嫩av| 3344国产精品免费看| 亚洲美女自拍视频| 日韩亚洲精品视频| 成人网欧美在线视频| 欧美日韩在线视频一区| 亚洲免费视频在线观看| 欧美激情欧美激情| 亚洲精品中文字幕有码专区| 色综合五月天导航| 国产精品一久久香蕉国产线看观看| 久久夜色精品亚洲噜噜国产mv| 国产在线播放91| 久久国产精品久久国产精品| 久久久久五月天| 亚洲欧美成人一区二区在线电影| 欧美主播福利视频| 精品一区二区三区三区| 欧美乱大交xxxxx| 92版电视剧仙鹤神针在线观看| 亚洲第一页自拍| 最近免费中文字幕视频2019| 国产精品日日做人人爱| www.午夜精品| 久久亚洲精品视频| 国产成人鲁鲁免费视频a| 亚洲一级黄色av| 在线免费观看羞羞视频一区二区| 色久欧美在线视频观看| 5566日本婷婷色中文字幕97| 欧美激情免费视频| 在线观看日韩av| 欧美丝袜美女中出在线| 在线视频一区二区| 国产亚洲a∨片在线观看| 久久中文精品视频| 亚洲精品二三区| 国内精久久久久久久久久人| 日韩**中文字幕毛片| 欧美一二三视频| 亚洲精品一区中文字幕乱码| www.久久撸.com| 久久亚洲综合国产精品99麻豆精品福利| 亚洲免费小视频| 日韩**中文字幕毛片| 全球成人中文在线| 久久久久久久久中文字幕| 精品在线小视频| 久久亚洲欧美日韩精品专区| 中文字幕日韩av综合精品| 高清视频欧美一级| 国产97免费视| 欧美视频二区36p| 亚洲国产精品中文| 日韩av在线免费观看| 中文字幕精品一区久久久久| 久久亚洲春色中文字幕| 午夜免费在线观看精品视频| 日韩有码在线电影| 日韩高清有码在线| 亚洲已满18点击进入在线看片| 国内久久久精品| 国产精品电影在线观看| 国产精欧美一区二区三区| 亚洲91精品在线| 久久艹在线视频| 一区二区三区高清国产| 亚洲福利视频在线| 26uuu日韩精品一区二区| 永久免费精品影视网站| 日韩av在线免费观看一区| 国产精品视频网| 国产欧美精品日韩精品| 中文字幕日韩欧美在线| 亚洲精品成人久久电影| 国产欧美一区二区三区久久| 亚洲精品日韩在线| 国产精品福利网| 国产精品视频网站| 成人久久18免费网站图片| 欧美亚洲视频一区二区| 日韩欧美成人区| 久久久久久999| 中文字幕av日韩| 欧美综合第一页| 欧美老女人在线视频| 国产亚洲综合久久| 国产91精品网站| 国产一区在线播放| 中文字幕在线日韩| 久久亚洲一区二区三区四区五区高| 国产精品久久久久久一区二区| 国产精品国产自产拍高清av水多| 欧美性猛交xxxx富婆| 欧美一区深夜视频| 亚洲欧美国产精品专区久久| 欧美国产日产韩国视频| 亚洲成人久久久| 国产视频精品一区二区三区| 亚洲欧美国产日韩中文字幕| 国产精品一区二区3区| 91美女片黄在线观看游戏| 91免费精品视频| 宅男66日本亚洲欧美视频| 精品亚洲va在线va天堂资源站| 久久成人免费视频| 日韩毛片中文字幕| 国产suv精品一区二区| 亚洲精品v天堂中文字幕| 亚洲国产精品电影| 欧美一区二区三区图| 亚洲自拍av在线| 美女少妇精品视频| 国产精品偷伦一区二区| 欧美成人亚洲成人日韩成人| 亚洲视频777| 97精品久久久中文字幕免费| 欧洲成人在线视频| 国产91网红主播在线观看| 欧美日韩一区二区免费在线观看| 久久久久女教师免费一区| 日日噜噜噜夜夜爽亚洲精品| 欧美在线视频播放| 国产一区二区三区视频| 成人激情黄色网| 欧美色xxxx| 亚洲精品乱码久久久久久按摩观| 国产精品爽爽ⅴa在线观看| 亚洲第一男人天堂| 国产成人精品最新| 91亚洲午夜在线| 精品福利樱桃av导航| 91av视频导航| 日韩精品在线视频观看| 欧美激情性做爰免费视频| 亚洲欧美日韩天堂| 国产成人亚洲综合91精品|