Access 2010 - 使用同一记录

时间:2015-06-23 20:22:03

标签: blob photo ole

我已经在网上搜了几天试图解决这个问题,但显然我在Access中的差距太大了,而答案却让我无法理解。有人显然already answered这个问题,但是我无法利用这些信息。

我的具体情况:

Table1有30,000多行和多列。 “照片路径”是具有图像的路径和文件名的文本字段。 “Photo”是一个当前为空的OLE对象字段。

我想要做的是将“照片路径”中指定的图像存储为“照片”中的OLE对象。

Table1 Current State:

Name   -     Photo Path     - Photo
Impala - C:\Cars\Impala.jpg -
Jeep   - C:\Cars\Jeep.jpg   - 

Table1 Desired Result:

Name   -     Photo Path     - Photo
Impala - C:\Cars\Impala.jpg - LONG BINARY DATA
Jeep   - C:\Cars\Jeep.jpg   - LONG BINARY DATA 

我不知道如何使用慷慨provided code对整个数据库执行FileToBlob()。作者似乎希望我使用一个表格,我也无法上班。

我认为我想要的是一个SQL语句,它将使用FileToBlob()或接近它的东西对Table1中的每一行执行。

我在SQL查询中尝试了以下语句的变体,但没有用。

SELECT Table1.[Photo Path], FileToBlob(Table1.[Photo Path],Table1.Photo) As Photo
FROM Table1;

感谢您抽出宝贵时间阅读本文并提供答案。

1 个答案:

答案 0 :(得分:0)

由于没有回应,不得不为自己找出这个。对于那些可能追随实际答案的人来说,就是这样。

我修改了我发现的符合我特定问题的代码。

创建一个新模块并将下面的代码放入其中。如果代码不合适,您可以尝试使用工具 - >引用,如果尚未选择,请选择“Microsoft DAO X.x Object Library”,其中X.x是最新的库。如果它仍然没有运行,你将不得不检查是否需要选择任何其他参考。

要记录的记录太多了,我觉得最好通过代码而不是可能需要很长时间才能执行的查询来执行此操作,并且不会知道发生了什么。在代码中,我将它写入Access中的状态栏,以便您知道自己所在的位置(但如果文件很小,它可能会飞过,但至少你知道它正在运行)。

要运行代码,只需将光标放在例程中的任何位置,我首先要按F8进入代码,以确保我处于正确的例行程序中。然后按F5运行其余代码。如果您想创建一个表单来运行代码,您也可以这样做。只需创建一个按钮,然后在“点击”事件中添加代码:

 call Load_Photo()

如果要查看状态更新,请确保在运行代码之前可以看到主访问窗口(如果从表单运行,它将已存在)。

注意我将Table1中的“Name”字段重命名为“strName”,因为“Name”是一个保留字。我建议不要使用“名称”作为字段名称。你可能没问题,但是你可能会遇到问题,特别是在通过代码引用字段时。如果您选择不更改字段名称,请更改代码。

另请注意,提供的示例代码存储为二进制文件。因此,如果您创建一个Access窗体来显示记录,图像将不会自动显示 - 还有其他一些我不熟悉的操作。

不用多说,这里是我正在寻找的解决方案的代码:

选项比较数据库 选项明确

Public Sub Load_Photo()
On Error GoTo LoadFileError

    Dim strSQL As String
    Dim rstTable As DAO.Recordset
    Dim strStatus As String
    Dim count As Integer
    Dim strFile As String
    Dim nFileNum As Integer
    Dim byteData() As Byte
    Dim varStatus As Boolean

'
'  In case something happens part way through the load, just load photos that have not been loaded yet.
'
    strSQL = "Select [strName], [Photo Path], [Photo] from Table1 Where [Photo] is null"
    Set rstTable = CurrentDb.OpenRecordset(strSQL)
    If rstTable.RecordCount > 0 Then
        rstTable.MoveFirst
        count = 0
        Do While Not rstTable.EOF
            strFile = rstTable![Photo Path]
            If Len(Dir(strFile)) > 0 Then
                nFileNum = FreeFile()
                Open strFile For Binary Access Read As nFileNum
                If LOF(nFileNum) > 0 Then
                    count = count + 1
'
' Show user status of loading
'
                    strStatus = "Loading photo " & count & " for " & rstTable![strName] & ":  " & rstTable![Photo Path]
                    varStatus = SysCmd(acSysCmdSetStatus, strStatus)
                    DoEvents
                    ReDim byteData(1 To LOF(nFileNum))
                    Get #nFileNum, , byteData
                    rstTable.Edit
                        rstTable![Photo] = byteData
                    rstTable.Update
                Else
                    MsgBox ("Error:  empty file, can't load for Name = " & rstTable![strName] & " and Photo Path = " & rstTable![Photo Path])
                End If
                Close nFileNum
            Else
                MsgBox ("Error:  File not found for Name = " & rstTable![strName] & " and Photo Path = " & rstTable![Photo Path])
            End If
            rstTable.MoveNext
        Loop
    End If

LoadFileExit:
    If nFileNum > 0 Then Close nFileNum
    rstTable.Close
    strStatus = " "
    varStatus = SysCmd(acSysCmdSetStatus, strStatus)
    Exit Sub

LoadFileError:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, "Error on " & strFile
    Resume LoadFileExit

End Sub