发信人: johnnyxu() 
整理人: chedong(1999-07-04 09:24:09), 站内信件
 | 
 
 
          VB Tips(7) -- 设计数据库图象存取DLL
 
     假设SQL Server数据库表中有一Image字段用来存放图像内容,如果要
 在VB的Image控件或在Web页中显示图像,必须先将Image内容从表中取出,
 保存为磁盘文件,返回文件名及路径。为了避免同一图像的反复存取,将取
 出的图像文件保存到一特定目录中,如果该目录中已有此图像文件,则无须
 从表从取出,而直接读取该文件即可。
 
 ' ImageLoader功能:
 '     1. 将Binary/Text文件内容保存到SQL Server的Image/Text字段
 '     2. 取出SQL Server的Image/Text字段内容到Binary/Text文件中
 ' 要求的数据库表结构:
 '     Image/Text字段      保存Binary/Image/Text文件内容
 '     Varchar字段           保存文件名(无路径),可选
 
 Private mImageFilePath As String ' 文件所在的目录
 Const BLOCKSIZE = 4096
 
 ' 设置存放文件的目录, 只写属性
 Public Property Let ImageFilePath(ByVal vFilePath As String)
     mImageFilePath = vFilePath
 End Property
 
 ' 如果文件已存在,则返回文件名,包括全路径;只读属性
 ' 如果不存在,则将Image/Text列的内容从表中取中,保存到新的文件中,
 ' 返回该文件名,包括全路径
 ' 输入参数:Fld                Image/Text字段
 '              vImageFile      文件名,包含文件最初所在的目录
 ' 返回值:    位于特定目录下的文件名
 
 Public Property Get ImageFile(ByRef Fld As ADODB.Field, ByVal vImageFi le _
                                         As String) As String
     Dim NumBlocks As Long
     Dim LeftOver As Long
     Dim byteData() As Byte   ' 用于处理Image 字段
     Dim strData As String      ' 用于处理Text 字段
     Dim DestFileNum As Integer
     Dim I As Integer
     Dim FldSize As Long
 
     Dim tmpImageFile As String
     '取得文件名,移去文件路径
     tmpImageFile = Mid(vImageFile, PosA(vImageFile, "\") + 1)
     FldSize = Fld.ActualSize
 
     ' 判断文件是否存在于特定的目录中,如果不存在,则将Image/Text列的内 容保存到
     ' 该目录下的一个新的文件中
     If Dir(mImageFilePath & tmpImageFile) = "" Then
         '文件不存在,
         DestFileNum = FreeFile
         Open mImageFilePath & tmpImageFile For Binary As DestFileNum
         NumBlocks = FldSize \ BLOCKSIZE
         LeftOver = FldSize Mod BLOCKSIZE
 
         Select Case Fld.Type
         Case adLongVarBinary 'Image 字段
             byteData() = Fld.GetChunk(LeftOver)
             Put DestFileNum, , byteData()
             For I = 1 To NumBlocks
                 byteData() = Fld.GetChunk(BLOCKSIZE)
                 Put DestFileNum, , byteData()
             Next I
         Case adLongVarChar 'Text 字段
             strData = String(BLOCKSIZE, 32)
             For I = 1 To NumBlocks
                 strData = Fld.GetChunk(BLOCKSIZE)
                 Put DestFileNum, , strData
             Next I
             strData = String(LeftOver, 32)
             strData = Fld.GetChunk(LeftOver)
             Put DestFileNum, , strData
         End Select
         Close DestFileNum
     End If
     ImageFile = mImageFilePath & tmpImageFile
     
 End Property
 
 ' 将Binary/Text文件内容保存到Image/Text字段
 ' 输入参数:Fld            Image/Text字段
 '              FldDesc      文件名字段,不包含路径,可选
 '              DiskFile      文件名,包含文件最初所在的目录
 
 Public Sub SaveToDB(ByRef Fld As ADODB.Field, DiskFile As String, _
  Optional ByRef FldDesc As ADODB.Field)
 
     Dim strData As String  '用于处理Text字段
     Dim byteData() As Byte '用于处理Image字段
     Dim NumBlocks As Long
     Dim FileLength As Long
     Dim LeftOver As Long
     Dim SourceFile As Long
     Dim I As Long
 
     SourceFile = FreeFile
     Open DiskFile For Binary Access Read As SourceFile
     FileLength = LOF(SourceFile)
     If FileLength = 0 Then
         Close SourceFile
         MsgBox DiskFile & " 无内容或不存在!"
     Else
         NumBlocks = FileLength \ BLOCKSIZE
         LeftOver = FileLength Mod BLOCKSIZE
         Fld.Value = Null
         Select Case Fld.Type
         Case adLongVarBinary 'Image 字段
             ReDim byteData(NumBlocks)
             For I = 1 To NumBlocks
                 Get SourceFile, , byteData()
                 Fld.AppendChunk byteData()
             Next I
             ReDim byteData(LeftOver)
             Get SourceFile, , byteData()
             Fld.AppendChunk byteData()
         Case adLongVarChar 'Text 字段
             strData = String(BLOCKSIZE, 32)
             For I = 1 To NumBlocks
                 Get SourceFile, , strData
                 Fld.AppendChunk strData
             Next I
             strData = String(LeftOver, 32)
             Fld.AppendChunk strData
         End Select
         Close SourceFile
         If Not IsMissing(FldDesc) Then FldDesc.Value = Mid(DiskFile, P osA(DiskFile, "\") + 1)
     End If
 End Sub
 
 Private Sub Class_Initialize()
     mImageFilePath = "C:\"
 End Sub
 
 Private Function PosA(Str1 As String, Char As String) As Integer
 
     For I = Len(Str1) To 1 Step -1
         tmp = Mid(Str1, I, 1)
         If tmp = Char Then
             PosA = I
             Exit Function
         End If
     Next
     PosA = 0
 End Function
 
 在VB中将以上代码封装到DLL中,可以方便地存取数据库图像字段。
 
 John
 [email protected]
  -- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.109.33.145]
  | 
 
 
 |