Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将jpg BLOB从Access 365查询传递到VBA函数时出现问题_Vba_Ms Access_User Defined Functions - Fatal编程技术网

将jpg BLOB从Access 365查询传递到VBA函数时出现问题

将jpg BLOB从Access 365查询传递到VBA函数时出现问题,vba,ms-access,user-defined-functions,Vba,Ms Access,User Defined Functions,我在ESRI SDE/MS SQL表中有BLOB JPEG,我在MS Access数据库中链接到该表。我想我已经在下面编写了一个VBA函数,我想它会将它们卸载到我的临时目录中。使用这段代码的一个变体,其中包含一个嵌入的DAOSQL查询(此处未共享),我可以成功卸载一张照片 我不想编写3个不同的函数来解释点、线和多边形,而是想在Access查询中调用该函数,将两个不同的整数值和BLOB字段内容传递给它 在构建访问查询时,我将这三个参数传递给函数,但它从未实际调用该函数。在同一个查询中,我成功地调用

我在ESRI SDE/MS SQL表中有BLOB JPEG,我在MS Access数据库中链接到该表。我想我已经在下面编写了一个VBA函数,我想它会将它们卸载到我的临时目录中。使用这段代码的一个变体,其中包含一个嵌入的DAOSQL查询(此处未共享),我可以成功卸载一张照片

我不想编写3个不同的函数来解释点、线和多边形,而是想在Access查询中调用该函数,将两个不同的整数值和BLOB字段内容传递给它

在构建访问查询时,我将这三个参数传递给函数,但它从未实际调用该函数。在同一个查询中,我成功地调用了另一个传递数据的函数。我不明白为什么在我的访问查询中调用此函数:

PicFileLoc: Blob2File([Landfill_InspectionPoint_Attach_vw].[ATTACHMENTID],[Landfill_InspectionPoint_Attach_vw].[DATA],[Landfill_InspectionPoint_evw].[ItemNo])
PicFileLoc: Blob2File([ATTACHMENTID],[DATA],[ItemNo])
不调用此函数。我错过了什么明显的东西?Blob不能传递给用户定义的函数吗?如果我将blbData的数据类型从Byte更改为String,代码将开始运行,但它显然会失败,因为BLOB不是字符串

Public Function Blob2File(ByVal intAttID As Integer, ByVal blbData As Byte, ByVal intItemNo As Integer) As String
    On Error GoTo Blob2FileError
    Dim strFile As String
    Dim nFileNum As Integer
    Dim abytData As Byte
    abytData = blbData
    Blob2File = Null

    strFile = Environ$("USERPROFILE") & "\Local Settings\Temp\" & intItemNo & "_Pic_" & intAttID & ".jpg" 'placed in the users temp directory on the local c drive.
    nFileNum = FreeFile
    Open strFile For Binary Access Write As nFileNum
    Put #nFileNum, , abytData
    Blob2File = strFile

Blob2FileExit:
    If nFileNum > 0 Then Close nFileNum
    Exit Function

Blob2FileError:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, _
           "Error writing file in Blob2File"
    Blob2File = Null
    Resume Blob2FileExit

End Function
谢谢


Dale

您允许blob数据仅为单个字节,而它是一个字节数组

通过添加声明中的名称和函数调用中的类型,将其更改为字节数组:

Public Function Blob2File(ByVal intAttID As Integer, ByVal blbData As Byte(), ByVal intItemNo As Integer) As String
    On Error GoTo Blob2FileError
    Dim strFile As String
    Dim nFileNum As Integer
    Dim abytData() As Byte
    abytData = blbData
    Blob2File = Null

    strFile = Environ$("USERPROFILE") & "\Local Settings\Temp\" & intItemNo & "_Pic_" & intAttID & ".jpg" 'placed in the users temp directory on the local c drive.
    nFileNum = FreeFile
    Open strFile For Binary Access Write As nFileNum
    Put #nFileNum, , abytData
    Blob2File = strFile

Blob2FileExit:
    If nFileNum > 0 Then Close nFileNum
    Exit Function

Blob2FileError:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, _
           "Error writing file in Blob2File"
    Blob2File = Null
    Resume Blob2FileExit

End Function

请注意,我强烈建议不要在查询中写入文件。数据库引擎可能会根据各种条件多次调用该函数,如果它决定只显示部分记录,直到所有记录都显示出来,则根本不会调用该函数。

因此,为了结束循环,我已使该函数按我所需的方式工作。需要明确的是,由于代码可以在最不期望的时候调用,所以使用记录集是理想的方法,但由于我时间有限,而且这是可行的,所以我将按原样使用它,我将在下面分享它

当我与VBA斗争并试图理解应该发生什么时,我将字节数组更改为字符串,然后很方便地忘记了这一点。因此,一旦Erik提供了字节数组信息,我应该已经准备好了,但是我忘记了我已经对我传递的内容进行了更改

我正在用手机拍摄需要修复的垃圾填埋场现场状况的jpeg图片。在ESRI的ArcGIS收集器中,它将照片存储在一个相关的表中,这些照片被困在ESRI的生态系统中。我使用此函数作为生成显示照片和描述的访问报告的步骤之一

这是来自访问查询的函数调用:

PicFileLoc: Blob2File([Landfill_InspectionPoint_Attach_vw].[ATTACHMENTID],[Landfill_InspectionPoint_Attach_vw].[DATA],[Landfill_InspectionPoint_evw].[ItemNo])
PicFileLoc: Blob2File([ATTACHMENTID],[DATA],[ItemNo])
这就是功能:

Public Function Blob2File(ByVal intAttID As Integer, ByRef blbData() As Byte, ByVal intItemNo As Integer) As String
    On Error GoTo Blob2FileError
    'This function is based off of this link: http://www.ammara.com/access_image_faq/read_write_blob.html
    'and modified for my needs.  Dale R. Bridgford 2019-09-06
    Dim strFile As String
    strFile = Environ$("USERPROFILE") & "\Local Settings\Temp\" & intItemNo & "_Pic_" & intAttID & ".jpg" 'placed in the users temp directory on the local c drive.
    Dim nFileNum As Integer
    Dim abytData() As Byte
    Blob2File = ""
    nFileNum = FreeFile
    abytData = blbData
    Open strFile For Binary Access Write As nFileNum
    Put #nFileNum, , abytData

    Blob2File = strFile 'passes back the path and filename of photo.

Blob2FileExit:
    If nFileNum > 0 Then Close nFileNum
    Exit Function

Blob2FileError:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, _
           "Error writing file in Blob2File"
    Blob2File = ""
    Resume Blob2FileExit

End Function
感谢所有帮助我的人


戴尔

正如埃里克所写,查询并不是一个好方法。改用记录集循环。谢谢Erik和Andre的帮助。您的修订是正确的,将函数声明更改为:ByVal blbData as Byte`````有助于改进。代码运行并写入一个不是jpg的文件。然而,我所看到的这个函数的每一个其他示例都将blbData作为对象引入。当我进行更改时,函数从未被调用。我假定对象是VBA的基本元素,不需要添加任何引用。顺便说一句,对于许多不同的表来说,这将是一个反复出现的问题,这就是为什么我传递了记录集并选择了这个路径。我的表有不同的字段。此外,它编写的jpg的大小是SQL表中报告的大小的两倍。如果是bytearray,则将BLOB作为对象引入显然是错误的。从缩小问题范围开始:传递给函数的数据是否与JPEG数据相同?写入文件的数据是否与传递给函数的数据相同?最后一个条件可以在写入数据后通过读回数据进行检查,第一个条件可以通过直接查看SQL server表或使用易于识别的数据创建测试记录进行检查。因此,我不确定它是否真的是字节数组。我一直在尝试从这里修改FileToBlob代码:这就是我试图将其作为对象引入的地方。在SQL表中,它是一个varbinaryMAX字段。这是一个jpg文件,当我完成整个记录集过程时,我可以将照片取出,但我试图避免为每个有照片的表创建VBA函数。相反,我希望创建一个函数,该函数可以从我当时需要的报表的任何查询中调用。谢谢。