首页 > 解决方案 > 从 MS Access 数据库中的 OLE 字段中提取数据

问题描述

我有一个 MS Access mdb 文件,该文件在 OLE 对象字段中有一个包含数据的表。查看数据时,此字段中会显示“长二进制数据”。此表中有一个附加列指定 OLE 字段包含的内容 - 这表示“Adobe Acrobat 文档”或“Microsoft Word 文档”。通过表单查看表格时,OLE 字段的内容既不会显示内容,也不会使用绑定的对象框显示图标。

我尝试了几种方法来导出此数据,但当我尝试打开文档时,Word 和 Adob​​e 都无法识别该文件。Adobe 无法识别格式,Word 要求我指定编码 - 我已经尝试了编码选项列表中的明显内容,但没有一个使文档可读。

我从表单上的命令按钮尝试了以下操作,其中记录源是具有 OLE 字段的表。已尝试将文件名指定为 .doc、.docx 或 .pdf 以适用于该行数据。我已经尝试使用从 Office 365 回到 2007 的 Access 并将 mdb 转换为 accdb 格式。所有人都将创建一个文档,但我无法阅读内容。

方法一

Dim mystream As New ADODB.Stream
Dim MyPath As String

MyPath = "C:\My path\My file name.doc"
mystream.Type = adTypeBinary
mystream.Open
mystream.Write Me!Documents 'reference to the control on my form
mystream.SaveToFile MyPath, adSaveCreateOverWrite
mystream.Close

方法二

Dim data() As Byte

data = Me!Documents
Open "C:\My path\My file name.doc" For Binary Access Write As #1
Put #1, , data
Close #1

方法三

Dim sConn As String
Dim oConn As New ADODB.Connection
Dim oRs As New ADODB.Recordset

sConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=full path and file name of accdb;Jet OLEDB:Database Password=********"

oConn.Open sConn
oRs.Open "SELECT tableName.FieldName FROM tableName WHERE (((tableName.id)=1))", oConn, adOpenKeyset, adLockOptimistic
LoadFileFromDB "full path and file name", oRs, "OLEfieldName"
oRs.Close

LoadFileFromDB 函数是:

Public Function LoadFileFromDB(FileName As String, RS As Object, FieldName As String) As Boolean
Dim iFileNum As Integer
Dim lFileLength As Long
Dim abBytes() As Byte
Dim iCtr As Integer

On Error GoTo ErrorHandler
If Not TypeOf RS Is ADODB.Recordset Then Exit Function

iFileNum = FreeFile
Open FileName For Binary As #iFileNum
lFileLength = LenB(RS(FieldName))

abBytes = RS(FieldName).GetChunk(lFileLength)
Put #iFileNum, , abBytes()
Close #iFileNum
LoadFileFromDB = True

ErrorHandler:
End Function

这个 Access mdb 的前端不是 Access 本身,我不知道它是什么,也不知道数据是如何插入到 OLE 字段中的。如果可能的话,我的客户只需要把它拿出来。我是在上面的示例中做了一些明显愚蠢的事情,还是如果我不知道这些数据是如何进入的,我就没有机会阅读这些数据?谢谢。

当使用文本恢复在 Word 中打开其中一个文件时,这就是我所看到的。

Root Entry
Root Entry
Contents
Contents
CStorageItem
Root Entry
Root Entry
CompObj
CompObj
CONTENTS
CONTENTS
Acrobat Document
AcroExch.Document.DC
%PDF-1.7
%âãÏ
92 0 obj
<</Linearized 1/L 115075/O 94/E 109672/N 1/T 114766/H [ 493 178]>>
endobj
               

108 0 obj
<</DecodeParms<</Columns 5/Predictor 12>>/Filter/FlateDecode/ID[<3643DDDCA0096D49B94B26A8F87F6F9F><D6948AE94979C841AEE3A5089F59C2D7>]/Index[92 33]/Info 91 0 R/Length 87/Prev 114767/Root 93 0 R/Size 125/Type/XRef/W[1 3 1]>>stream

hÞbbd`
2

endstream
endobj
startxref

0

%%EOF

        

124 0 obj
<</C 92/Filter/FlateDecode/I 114/Length 92/S 38>>stream

hÞb``àc``ªg```\i΀

0

endstream
endobj
93 0 obj
<</Lang(en-GB)/MarkInfo<</Marked true>>/Metadata 2 0 R/Pages 90 0 R/StructTreeRoot 6 0 R/Type/Catalog/ViewerPreferences 109 0 R>>
endobj

标签: ms-accessole

解决方案


推荐阅读