2017-08-15 69 views
0

我有下面的代码将存储在链接的Oracle表中的blob字段中的数据下载到文件中。 Blob数据存储excel文件(.xlsx),但当我尝试在Excel中打开下载的文件时,出现错误,指出文件已损坏,格式不正确。下面的代码 -使用Access VBA打开从Oracle数据库中的blob字段下载的excel文件时发现错误

Option Explicit 
Const BlockSize = 32768 

Public Function DownloadBlob() 
    Dim db As Database 
    Dim rst As Recordset 
    Dim NumBlocks As Integer, DestFile As Integer, i As Integer 
    Dim FileLength As Long, LeftOver As Long 
    Dim FileData, FilePath As String 
    Dim RetVal As Variant 

    Set db = CurrentDb 
    Set rst = db.OpenRecordset("Select Blob_Field FROM Table1;") 

    NumBlocks = FileLength/BlockSize 
    LeftOver = FileLength Mod BlockSize 

    DestFile = FreeFile() 
    FilePath = "C:\Desktop\test.xlsx" 

    Open FilePath For Output As DestFile 
    Close DestFile 

    Open FilePath For Binary As DestFile 
    FileData = rst.Fields(0).GetChunk(0, LeftOver) 
    Put DestFile, , FileData 
    For i = 1 To NumBlocks 
     FileData = rst.Fields(0).GetChunk((i - 1) * BlockSize + LeftOver, BlockSize) 
     Put DestFile, , FileData 
    Next i 
Close DestFile 
End Function 
+1

你在文件顶部有'Const BlockSize = 32768',对吗?通过GUI提取文件时没有问题? –

+0

您在Access中,DB限制为2GB。为什么要浪费宝贵的存储空间来存放文件服务器上完美的存储空间? –

+0

对不起,如果我之前没有更清楚,正如我在标题中所述,该表是Oracle数据库中的链接表,因此2GB限制不适用,并且我只有RO访问该数据库的权限,并且必须下载这些excel文件。 –

回答

2

由于@TimWilliams评论道嵌套在长期内螺纹,可以考虑使用ADO Stream object来提取记录字段值的数据。下面用ADO来演示一个不同的DB-API,它与Access默认的DB-API,DAO一起使用。但是,您仍然可以在ADO流对象中使用DAO记录集。

Public Function DownloadBlob() 
    ' ENABLE REFERENCE: Microsoft ActiveX Data Objects X.X Library 
    Dim conn As New ADODB.Connection, rs AS New ADODB.Recordset 
    Dim stm As New ADODB.Stream 
    Dim strFile As String 

    strFile = "C:\Desktop\test.xlsx" 

    conn.Open "<Connection String To Oracle>" 
    rs.Open "SELECT Blob_Field FROM Table1", conn 

    With stm 
     .Open 
     .Type = adTypeBinary 
     .Write rs.Fields("Blob_Field").Value 
     .SaveToFile strFile 
     .Close 
    End With 

    rs.Close: conn.Close 

ExitHandle: 
    Set stm = Nothing: Set rs = Nothing: Set conn = Nothing 

ErrHandle: 
    Msgbox Err.Number & " - " & Err.Description, vbCritical 
    Resume ExitHandle  
End Function 

美太此DAO到ADO开关的是这个VBA代码可以在包括Excel任何Office应用程序工作,因为它免除任何MS访问对象(即,链接表,DAO)。对于这一点,甚至超越VBA到任何COM连接库(Java的jacob,Python的win32com,R的RDCOMClient,PHP的COM)。

+0

我很确定ADODB.Stream对象可用于存储和检索DAO.Recordset中的BLOB数据,因此使用ADODB.Stream对象不需要*将连接和记录集从DAO更改为ADODB 。 –

+1

谢谢@GordThompson ...我改变了* require *行。 – Parfait

相关问题