2017-08-15 37 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

相關問題