Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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
Sql server 如何使用ms access 2007打开存储在sql server[图像]字段中的PDF_Sql Server_Ms Access_Vba - Fatal编程技术网

Sql server 如何使用ms access 2007打开存储在sql server[图像]字段中的PDF

Sql server 如何使用ms access 2007打开存储在sql server[图像]字段中的PDF,sql-server,ms-access,vba,Sql Server,Ms Access,Vba,我正在将数据库从access转换为sql后端access前端。数据库中嵌入了pdf文档,这些文档最终通过SQL server的数据导入工具存储为[图像]数据 我的问题是,我希望用户能够通过单击access中创建的报表中的pdf图标来打开pdf文件 这可以用VBA来完成,还是有更简单的方法?我完全不知道如何才能做到这一点 谢谢你的回答 我编辑了BlobToFile函数以去掉ole头,因为adobe无法读取文件evice可以读取,mac preview也可以读取 我可以像这样做我想要的: Priv

我正在将数据库从access转换为sql后端access前端。数据库中嵌入了pdf文档,这些文档最终通过SQL server的数据导入工具存储为[图像]数据

我的问题是,我希望用户能够通过单击access中创建的报表中的pdf图标来打开pdf文件

这可以用VBA来完成,还是有更简单的方法?我完全不知道如何才能做到这一点

谢谢你的回答

我编辑了BlobToFile函数以去掉ole头,因为adobe无法读取文件evice可以读取,mac preview也可以读取

我可以像这样做我想要的:

 Private Sub PDFDocument_Click()
     Call BlobToFile("C:\db\MyPDFFile.pdf", Me.PDFDocument)
     If Dir("C:\db\MyPDFFile.pdf") <> "" Then
        FollowHyperlink ("C:\db\MyPDFFile.pdf")
     End If
 End Sub

 'Function:  BlobToFile - Extracts the data in a binary field to a disk file.
 'Parameter: strFile - Full path and filename of the destination file.
 'Parameter: Field - The field containing the blob.
 'Return:    The length of the data extracted.
  Public Function BlobToFile(strFile As String, ByRef Field As Object) As Long
     On Error GoTo BlobToFileError

     Dim nFileNum As Integer
     Dim abytData() As Byte
     Dim abytParsedData() As Byte
     Dim copyOn As Boolean
     Dim copyIndex As Long

     BlobToFile = 0
     nFileNum = FreeFile
     copyOn = False
     copyIndex = 0

     Open strFile For Binary Access Write As nFileNum
     abytData = Field
     ReDim abytParsedData(UBound(abytData))

     For i = LBound(abytData) To UBound(abytData) - 1
         If copyOn = False Then
             If Chr(abytData(i)) = "%" And Chr(abytData(i + 1)) = "P" And Chr(abytData(i + 2)) = "D" And Chr(abytData(i + 3)) = "F" Then
                 copyOn = True
             End If
         End If

         If copyOn = True Then
             abytParsedData(copyIndex) = abytData(i)
             copyIndex = copyIndex + 1
         End If
     Next

     Put #nFileNum, , abytParsedData

     BlobToFile = LOF(nFileNum)

     BlobToFileExit:
     If nFileNum > 0 Then Close nFileNum
          Exit Function

     BlobToFileError:
     MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, _
            "Error writing file in BlobToFile"
     BlobToFile = 0
     Resume BlobToFileExit

 End Function

如果我理解您的意图,您基本上希望Adobe Reader打开内存中的pdf文件对象。这是不可能的。您需要将pdf文件写入系统硬盘,然后从那里打开它。通过使用computers Temp文件夹或自己管理文件/文件夹,您可以在某种程度上实现您的要求。例如,您可以在每次打开应用程序时清理PDF文件文件夹

这里有一些代码可以帮助你完成你想做的事情。这段代码与创建文件夹、生成文件名、检查文件是否已经存在等无关。我假设您能够处理这些。Command1_Click中的我的代码假定您正在使用SQL Server和ODBC链接表

我在这里使用了FollowHyperlink,但我强烈建议您使用它来打开文件。您可能会在FollowHyperlink中出现安全错误

Private Sub Command1_Click()
    Dim r As DAO.Recordset, sSQL As String
    sSQL = "SELECT ID, BlobField FROM MyTable"
    Set r = CurrentDb.OpenRecordset(sSQL, dbOpenDynaset, dbSeeChanges)
    If Not (r.EOF And r.BOF) Then
        Call BlobToFile("C:\MyPDFFile.pdf", r("BlobField"))
        If Dir("C:\MyPDFFile.pdf") <> "" Then
            FollowHyperlink("C:\MyPDFFile.pdf")
        End If
    End If
    r.Close
    Set r = Nothing
End Sub


'Function:  BlobToFile - Extracts the data in a binary field to a disk file.
'Parameter: strFile - Full path and filename of the destination file.
'Parameter: Field - The field containing the blob.
'Return:    The length of the data extracted.
Public Function BlobToFile(strFile As String, ByRef Field As Object) As Long
    On Error GoTo BlobToFileError

    Dim nFileNum As Integer
    Dim abytData() As Byte
    BlobToFile = 0
    nFileNum = FreeFile
    Open strFile For Binary Access Write As nFileNum
    abytData = Field
    Put #nFileNum, , abytData
    BlobToFile = LOF(nFileNum)

BlobToFileExit:
    If nFileNum > 0 Then Close nFileNum
    Exit Function

BlobToFileError:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, _
           "Error writing file in BlobToFile"
    BlobToFile = 0
    Resume BlobToFileExit

End Function

重复的问题是StackOverflow的一大禁忌。这不是一个传统的论坛。我建议你删除你的另一个问题: