ms-access - 从 MS Access 数据库中的 OLE 字段中提取数据
问题描述
我有一个 MS Access mdb 文件,该文件在 OLE 对象字段中有一个包含数据的表。查看数据时,此字段中会显示“长二进制数据”。此表中有一个附加列指定 OLE 字段包含的内容 - 这表示“Adobe Acrobat 文档”或“Microsoft Word 文档”。通过表单查看表格时,OLE 字段的内容既不会显示内容,也不会使用绑定的对象框显示图标。
我尝试了几种方法来导出此数据,但当我尝试打开文档时,Word 和 Adobe 都无法识别该文件。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
解决方案
推荐阅读
- iis - 防止热链接不起作用 IIS 10 - Windows server 2016
- kdb - 保存到 csv 时 kdb+ 日期格式发生变化
- linux - 将脚本制作为后台进程
- java - IgniteJdbcThinDrive 无法启动打开 jdk 11
- r - 如何在ggplot曲线中添加数据点?
- javascript - 向下滚动并且地址栏(Chrome和Safari)向下滑动后,有什么方法可以保持100vh?
- python - 我不能在 cv2.imshow() 中检查图像数组的整个或特定像素值吗?
- google-apps-script - 如何让我的代码插入光标处,而不是自动附加到文档末尾
- azure - Azure 数据工厂 - 数据流
- c - 如何修复我的函数中的条件?