(转) QTP Scripting - 实践5

上一篇 / 下一篇  2008-12-20 12:00:37 / 个人分类:QTP

针对论坛问题进行实战,在论坛寻找没有被解决的问题进行实战代码演练,问题如下

http://bbs.51testing.com/thread-119326-1-2.html 

这里面问题的难点主要利用ado如何读取数据库大二进制流的数据,如何把图片插入到excel中

ado需要利用的方法: GetChunk

功能:
返回大型文本或二进制数据   Field   对象的全部或部分内容。  
语法  
 variable   =   field.GetChunk(   Size   )  
返回值  
返回变体型。  
参数  
Size       长整型表达式,等于所要检索的字节或字符数。  
说明  
使用   Field   对象的   GetChunk   方法检索其部分或全部长二进制或字符数据。在系统内存有限的情况下,可使用   GetChunk   方法处理部分而非全部的长整型值。  
GetChunk   调用返回的数据将赋给“变量”。如果   Size   大于剩余的数据,则   GetChunk   仅返回剩余的数据而无需用空白填充“变量”。如果字段为空,则   GetChunk   方法返回   Null。  
每个后续的   GetChunk   调用将检索从前一次   GetChunk   调用停止处开始的数据。但是,如果从一个字段检索数据然后在当前记录中设置或读取另一个字段的值,ADO   将认为已从第一个字段中检索出数据。如果在第一个字段上再次调用   GetChunk   方法,ADO   将把调用解释为新的   GetChunk   操作并从记录的起始处开始读取。如果其他   Recordset   对象不是首个   Recordset   对象的副本,则访问其中的字段不会破坏   GetChunk   操作。  
如果   Field   对象的   Attributes   属性中的   adFldLong   位设置为   True,则可以对该字段使用   GetChunk   方法。  
如果在   Field   对象上使用   Getchunk   方法时没有当前记录,将产生错误   3021(无当前记录)。

解决问题代码:

sub main
     save_pic
     insert_Excel_pic
end sub

 

Sub Save_Pic()
   Dim DcnNWind 'As ADODB.Connection
   Dim rs  'As ADODB.Recordset
   set DcnNWind=New ADODB.Connection
   Set rs = New ADODB.Recordset
   DcnNWind.CursorLocation = adUseClient
   DcnNWind.Open "Provider=SQLOLEDB.1;Integrated Security=SSI;Persist Security Info=False;Initial

Catalog=CUSTOM;Data Source=SERVER"
   rs.CursorType = adOpenKeyset
   rs.LockType = adLockOptimistic
   rs.Open "CustomInfo", DcnNWind, , adCmdTable
   rs.Move 第几行数据 '指针指向到第几行数据
   Call BlobToFile (rs.Fields("Image"), "c:\windows\temp\tmp.bmp", rs.Fields("Image").ActualSize)

End Sub

 

Sub BlobToFile(fld , FileName, Optional ChunkSize )
   Dim fnum , bytesLeft , bytes
   Dim tmp()  'As Byte
   If (fld.Attributes And adFldLong) = 0 Then
      Err.Raise 1001, , "Field doesn't support the GetChunk method."
   End If
   If Dir$(FileName) <> "" Then Kill FileName
   fnum = FreeFile
   Open FileName For Binary As fnum
   bytesLeft = fld.ActualSize
   Do While bytesLeft
      bytes = bytesLeft
      If bytes > ChunkSize Then bytes = ChunkSize
      tmp = fld.GetChunk(bytes)
      Put #fnum, , tmp
      bytesLeft = bytesLeft - bytes
   Loop
   Close #fnum
end sub


Sub insert_Excel_pic()
Set ōbjExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.Workbooks.Add
objExcel.Range("A1").Select
objExcel.ActiveSheet.Pictures.Insert("C:\a.bmp").Select
'处理Excel
set ōbjExcel=Nothing
End Sub



TAG:

 

评分:0

我来说两句

Open Toolbar