[轉]VB圖片讀取!

  1. '将二进制文件添加到数据库中(该记录必须在存在)
  2. '函数名:FileToRecode
  3. '参数:  P_Cnn ADODB连接,TabName 目标数据表,FldName 目标字段,WhereStr 更新条件,FileName 源文件名
  4. '返回值:
  5. '例:    CALL  FileToRecode(P_Cnn,"AchGoods","GdsPhoto","Where gdsid='001'","C:/Tmp.Bmp")
  6. Public Function FileToRecode(ByRef P_Cnn As ADODB.Connection, _
  7.                              TabName As String, _
  8.                              FldName As String, _
  9.                              WhereStr As String, _
  10.                              Filename As StringAs Boolean
  11.     
  12.     Dim RsB As New ADODB.Recordset
  13.     Dim Person_name As String
  14.     Dim StrSql As String
  15.     Dim File_Num As String
  16.     Dim File_Length As String
  17.     Dim Bytes() As Byte
  18.     Dim Num_Blocks As Long
  19.     Dim Left_Over As Long
  20.     Dim Block_Num As Long
  21.     
  22.     Err.Clear
  23.     On Error Resume Next
  24.     
  25.     File_Num = FreeFile
  26.     Filename = Trim$(Filename)
  27.     
  28.     If P_Cnn.State <> 1 Then P_Cnn.Open
  29.     
  30.     If Len(Dir$(Filename)) = 0 Or Len(Filename) = 0 Then FileToRecode = FalseExit Function
  31.     
  32.     Open Filename For Binary Access Read As #File_Num
  33.         File_Length = LOF(File_Num)                 '取文件大小
  34.         If File_Length > 0 Then
  35.             Num_Blocks = File_Length / Block_Size
  36.             Left_Over = File_Length Mod Block_Size
  37.             
  38.             If Left$(Trim$(UCase$(WhereStr)), Len("where")) <> UCase$("where"Then WhereStr = "Where " & Trim$(WhereStr)
  39.             StrSql = "Select Top 1 [" & TabName & "].[" & FldName & "] From [" & TabName & "] " & WhereStr
  40.             Set RsB = RsOpen(P_Cnn, StrSql, False'连接式记录集
  41.             If Not (RsB.EOF And RsB.BOF) Then
  42.             
  43. '/            '不分块写
  44. '/            ReDim Bytes(File_Length)
  45. '/            Get #File_Num, , Bytes()
  46. '/            DoEvents
  47. '/            RsB.Fields(FldName).AppendChunk Bytes()
  48.             '/分块写
  49.                 ReDim Bytes(Block_Size)
  50.                 For Block_Num = 1 To Num_Blocks
  51.                     Get #File_Num, , Bytes()
  52.                     RsB.Fields(FldName).AppendChunk Bytes()
  53.                 Next
  54.                 
  55.                 If Left_Over > 0 Then
  56.                     ReDim Bytes(Left_Over)
  57.                     Get #File_Num, , Bytes()
  58.                     RsB.Fields(FldName).AppendChunk Bytes()
  59.                 End If
  60.                 RsB.Update
  61.                 DoEvents
  62.             End If
  63.             If RsB.State = adStateOpen Then
  64.                RsB.Close
  65.                Set RsB = Nothing
  66.             End If
  67.         End If
  68.     Close #File_Num
  69.     Erase Bytes
  70.     FileToRecode = (Err.Number = 0)
  71.     Err.Clear
  72. End Function
  73. '
  74. '将二进制数据从记录中取出
  75. '函数名:RecodeToFile
  76. '参数:  P_Cnn ADODB连接,TabName 源数据表,FldName 源字段名, WhereStr 取字段条件,FileType 生成临时文件的类型
  77. '返回值:'一个临时文件名
  78. '例:    GetTmpFile=RecodeToFile(P_Conn,"achgoods","achphoto","where gdsid='001',"bmp")
  79. Public Function RecodeToFile(ByRef P_Cnn As ADODB.Connection, _
  80.                              TabName As String, _
  81.                              FldName As String, _
  82.                              WhereStr As String, _
  83.                              Optional FileType As String = "Bmp"As String
  84.     
  85.     Dim Rs As New ADODB.Recordset
  86.     Dim StrSql As String
  87.     
  88.     Dim Bytes() As Byte
  89.     Dim File_Name As String
  90.     Dim File_Num As Integer
  91.     Dim File_Length As Long
  92.     Dim Num_Blocks As Long
  93.     Dim Left_Over As Long
  94.     Dim Block_Num As Long
  95.     Dim WorkPath As String
  96.     Dim TmpDir As New SmSysCls
  97.     
  98.     Err.Clear
  99.     On Error Resume Next
  100.     
  101.      WorkPath = TmpDir.GetFolder(SmWinTempDirectory)
  102.      If Dir$(WorkPath, vbDirectory) = "" Then WorkPath = App.Path
  103.      If Right$(WorkPath, 1) <> "/" Then WorkPath = WorkPath & "/"
  104.     
  105.      If Left$(Trim$(UCase$(WhereStr)), Len("where")) <> UCase$("where"Then WhereStr = "Where " & Trim$(WhereStr)
  106.      StrSql = "Select Top 1 [" & TabName & "].[" & FldName & "] From [" & TabName & "] " & WhereStr
  107.      Set Rs = RsOpen(P_Cnn, StrSql)
  108.      If Rs.BOF And Rs.EOF Then Exit Function
  109.      
  110.      If P_Cnn.State <> 1 Then P_Cnn.Open
  111.      
  112.      If Not IsNull(Rs.Fields(FldName)) Then
  113.          File_Name = WorkPath & "TmpFile." & FileType
  114.          If Len(Dir(File_Name)) <> 0 Then Kill File_Name
  115.          File_Num = FreeFile
  116.          Open File_Name For Binary As #File_Num
  117.              File_Length = CT.ToLng(Rs.Fields(FldName).ActualSize) '取字段的实际大小
  118. '/不分块读写
  119. '/             If File_Length > 0 Then
  120. '/                Bytes() = Rs.Fields(FldName).GetChunk(File_Length)
  121. '/                Put #File_Num, , Bytes()
  122. '/             Else
  123. '/                Err = -1
  124. '/             End If
  125. '/分块读写
  126.              Num_Blocks = File_Length / Block_Size
  127.              Left_Over = File_Length Mod Block_Size
  128.              For Block_Num = 1 To Num_Blocks
  129.                  Bytes() = Rs.Fields(FldName).GetChunk(Block_Size)
  130.                  Put #File_Num, , Bytes()
  131.              Next
  132.              If Left_Over > 0 Then
  133.                  Bytes() = Rs.Fields(FldName).GetChunk(Left_Over)
  134.                  Put #File_Num, , Bytes()
  135.              End If
  136.              Erase Bytes
  137.          Close #File_Num
  138.          
  139.         If Rs.State = adStateOpen Then
  140.            Rs.Close
  141.            Set Rs = Nothing
  142.         End If
  143.             
  144.          Erase Bytes
  145.     End If
  146.     RecodeToFile = IIf(Err.Number = 0, File_Name, "")
  147.     Set TmpDir = Nothing
  148.     Err.Clear
  149. End Function
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值