【问题标题】:Upload files (like PDF, image, Word...) to a table in SQL Server using Excel VBA使用 Excel VBA 将文件(如 PDF、图像、Word...)上传到 SQL Server 中的表
【发布时间】:2021-04-29 03:55:34
【问题描述】:

我有一个 Excel 文件,一些用户将其用作前端,我希望能够通过 VBA 将一般文件(如 PDF、图像、word 文档...)上传到 SQL Server。

在搜索了很多网站后,我整理了一些代码,但我不知道在 VBA SQL 变量(INSERT INTO 查询)中写什么来上传一些通用文件(例如 PDF)

VBA 代码:

Sub SaveAsBinary()

    Dim adoStream As Object
    Dim adoCmd As Object
    Dim strFilePath As String
    Dim adoCon As Object
  
    Dim SQL As String
    Dim FileNameStr as String
  
    
    Set adoCon = CreateObject("ADODB.Connection")
    Set adoStream = CreateObject("ADODB.Stream")
    Set adoCmd = CreateObject("ADODB.Command")
    
    '--Open Connection to SQL server
    adoCon.CursorLocation = 3 'adUseClient
    
    adoCon.Open = "Driver={SQL Server Native Client 11.0};" _
                        & "MyServerName;" _
                        & "Database=MyDatabaseName;" _
                        & "Uid=MyUserName;" _
                        & "Pwd={MyPassword};" _
                        & "Connection Timeout=30;"
    
    
    '----
    
    strFilePath = Range("a1").Value 'keep File path to upload (simple local computer path)
    FileNameStr = Dir(strFilePath )
    
    SQL = "INSERT INTO Tbl_Test VALUES (FileNameStr, ??)" '‹‹---What value should be here for loading a pdf file (for example)

    
    adoStream.Type = 1 'adTypeBinary
    adoStream.Open
    adoStream.LoadFromFile strFilePath 'It fails if file is open
        
    With adoCmd
        .CommandText = SQL ' Query
        .CommandType = 1 ' adCmdText
        
        '---adding parameters
        .Parameters.Append .CreateParameter("@FileName", 20, 1, 0, 1)
        .Parameters.Append .CreateParameter("@MyFile", 204, 1, adoStream.Size, adoStream.Read)
        '---
    End With
    
    adoCmd.ActiveConnection = adoCon
    adoCmd.Execute
        
    adoCon.Close
    
End Sub

原始代码取自: https://usefulgyaan.wordpress.com/2014/09/30/store-and-fetch-files-sql-server-tables/

Sql server 中的表:

CREATE TABLE [dbo].[Tbl_Test](
    [FileName] [nvarchar](200) NOT NULL,
    [MyFile] [varbinary](max) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

一栏是文件名,一栏是文件本身。

注意:SQL Server 位于没有共享文件夹/BLOB/FTP 的远程服务器上。

【问题讨论】:

  • “不起作用” 不是有用的错误描述。也没有问题要回答。请参阅 [mvce] 和 How to Ask 以改进您的问题。
  • [mvce] = minimal reproducible example(对不起)。
  • Pᴇʜ ,我更新了我的问题,希望现在问题更清楚了
  • 还是没有错误说明?出了什么问题? • 此外,没有任何问题。
  • 我猜它应该是VALUES (?, ?),就像原始代码一样。在这里您需要指定您的文件名.CreateParameter("@FileName") 而不是原始代码中的ID,在这里.CreateParameter("@MyFile" 您将文件发送为adoStream

标签: sql sql-server excel vba tsql


【解决方案1】:

解决方案是保持这条线为

SQL = "INSERT INTO Tbl_Test VALUES (?, ?)"

并将参数填写到该 SQL 中

.Parameters.Append .CreateParameter("@FileName", 20, 1, 0, 1)
.Parameters.Append .CreateParameter("@MyFile", 204, 1, adoStream.Size, adoStream.Read)

使用CreateParameter Method 和适合数据库字段的数据类型。

【讨论】:

  • 这就是解决办法,你只需要把204换成205
【解决方案2】:

我会这样做:

SQL = "INSERT INTO Tbl_Test([FileName],[MyFile]) VALUES ('" & FileNameStr & "', CAST(" & adoStream.Read & ") as varbinary(max))"

备注: 未在 VBA 中测试 - 我是 AutoIt 编码器,而不是 VBA 编码器。

【讨论】:

猜你喜欢
  • 2021-06-14
  • 2019-12-24
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多