【问题标题】:How to copy the contents of an attached file from an MS Access DB into a VBA variable?如何将附件的内容从 MS Access DB 复制到 VBA 变量中?
【发布时间】:2013-01-08 20:14:45
【问题描述】:

背景信息: 我对 VBA 或 Access 不是很了解,但是我有一个 VBA 脚本,它可以在用户计算机上创建一个文件(具体来说是一个 KML,但这对我的问题来说并不重要)并写入它使用链接到数据库中记录的变量。因此:

Dim MyDB As Database
Dim MyRS As Recordset
Dim QryOrTblDef As String
Dim TestFile As Integer

    QryOrTblDef = "Table1" 
    Set MyDB = CurrentDb
    Set MyRS = MyDB.OpenRecordset(QryOrTblDef)
    TestFile = FreeFile

    Open "C:\Testing.txt"
    Print #TestFile, "Generic Stuff"
    Print #TestFile, MyRS.Fields(0)

等等。

我的情况: 我有一个非常大的字符串(一个包含大量多边形顶点坐标列表的文本文档),我想将它添加到要打印到另一个文件(KML 文件,在上面的示例中提到)的变量中。我希望将此包含坐标的文本文件作为附件数据类型添加到 Access 数据库中,并将其内容复制到要在上述脚本中使用的变量中。

我的问题: 有没有一种方法可以访问附加文本文件(作为 MS Access 数据库字段中的附件数据类型附加)中的数据并将其复制到变量中,以便我可以在 VBA 脚本中使用它?

我发现了什么: 我无法找到有关此主题的信息我认为主要是因为我不知道要搜索哪些关键字,但我能够在论坛“ozgrid”上找到某人的代码,这似乎接近什么我想要做。尽管它只是从磁盘上的文本文件中提取,而不是从附加到数据库的文本文件中提取。

来自上述论坛的代码,它创建了一个访问文本文件中数据的函数:

Sub Test() 

    Dim strText As String 

    strText = GetFileContent("C:\temp\x.txt") 
    MsgBox strText 

End Sub 

Function GetFileContent(Name As String) As String 
    Dim intUnit As Integer 

    On Error Goto ErrGetFileContent 
    intUnit = FreeFile 
    Open Name For Input As intUnit 
    GetFileContent = Input(LOF(intUnit), intUnit) 
ErrGetFileContent: 
    Close intUnit 
    Exit Function 
End Function 

感谢您提供任何帮助。谢谢。

【问题讨论】:

  • 您是否尝试过使用 fso(文件系统对象)。 stackoverflow.com/questions/9442215/…其他样品4guysfromrolla
  • 感谢您的提示,正如我所说,我在搜索关键字方面有点碰壁。文件系统对象看起来适合我的目的。很有帮助。

标签: ms-access vba attachment


【解决方案1】:

如果您存储纯文本,甚至存储有组织的文本的表格,为什么备忘录数据类型不适合,我有点困惑。话虽如此,一种方法是输出到磁盘并读入字符串。

''Ref: Windows Script Host Object Model
Dim fs As New FileSystemObject
Dim ts As TextStream
Dim rs As DAO.Recordset, rsA As DAO.Recordset
Dim sFilePath As String
Dim sFileText As String

    sFilePath = "z:\docs\"

    Set rs = CurrentDb.OpenRecordset("maintable")
    Set rsA = rs.Fields("aAttachment").Value

    ''File exists
    If Not fs.FileExists(sFilePath & rsA.Fields("FileName").Value) Then
        ''It will save with the existing FileName, but you can assign a new name
        rsA.Fields("FileData").SaveToFile sFilePath
    End If

    Set ts = fs.OpenTextFile(sFilePath _
           & rsA.Fields("FileName").Value, ForReading)

    sFileText = ts.ReadAll

另见:http://msdn.microsoft.com/en-us/library/office/ff835669.aspx

【讨论】:

  • 非常感谢 Remou,这非常适合我的目的。我也非常感谢代码。我考虑过备忘录,但据我了解,备忘录有 60 到千个字符的限制,而我的最大字符串约为 340 万个字符(大多边形的 x、y 和 z 顶点)。再次感谢。
  • Remou,您知道如何使用嵌入的 OLE 对象而不是附件来做同样的事情吗?
  • @Chaz 嵌入的 OLE 对象可能会因为包装器而变得痛苦。有一个我没有测试过的 c# 解决方案 (jvdveen.blogspot.in/2009/02/…) 和 Lebans 的解决方案,如果你是 32 位 (lebans.com/oletodisk.htm) MSDN 上还有用于 BLOB 的代码 (support.microsoft.com/kb/103257)。在某些情况下,ADODB 流会起作用。
  • 感谢您的信息。我会调查的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2018-09-12
  • 2015-08-19
  • 1970-01-01
相关资源
最近更新 更多