使用 SQL Server 后端将图片插入到 Access 表中

Posted

技术标签:

【中文标题】使用 SQL Server 后端将图片插入到 Access 表中【英文标题】:Insert a picture into a Access table with a SQL Server Backend 【发布时间】:2021-09-21 00:14:17 【问题描述】:

我需要将图像插入 MS Access 表单(不要链接它,因为它是一个许可证,并且需要加密和保护)。我有一个 MS Access 前端和一个 SQL Server 后端。这是插入的代码

Private Sub AddLicence1Picture_Click()
    Dim f As Object
    Set f = Application.FileDialog(1)
    f.allowmultiselect = False
    If (f.Show = True) Then
    Me![LicencePicture1].Picture = f.selecteditems(1)
    End If
End Sub

我有一个包含所有其他数据的表和一个名为LicencePicture1 的列,数据类型设置为IMAGE,我也尝试将其设置为VARBINARY(MAX)。谁能指出我做错了什么的正确方向?

【问题讨论】:

当您说“SQL 后端”时,您实际上是指“SQL Server 后端”吗? (SQL 本身不是数据库)。你绝对应该使用VARBINARY(MAX) 而不是IMAGE 是的,它是一个 SQL server 后端 没问题,完成。 【参考方案1】:

嗯,一次一步(加密可以是第 2 部分)。

因此,由于某种原因,varbinary(max) 列不适用于标准 odbc 驱动程序。 但是,如果您创建 sql server image 列,那么它可以/将会工作。

第一步?使用新的图像控件 - 而不是功能区中的 oleDB。

所以,选择这个:

接下来,你会发现如果你将那个图像控件绑定到数据库列(将表链接到 sql server),它将不起作用。

但是,您仍然可以将图像文件(作为原始二进制文件)推入该列,并保存当前记录。

而且还可以显示。

因此,您可以导航到给定的记录,然后说有一个按钮来浏览给定的文件 - 类似于您所拥有的。

所以,我们有这个:

  Private Sub cmdFile_Click()
  
     Dim f As FileDialog
     Set f = Application.FileDialog(msoFileDialogFilePicker)
     
     f.Show
     
     If f.SelectedItems.Count > 0 Then
        Me.txtFile = f.SelectedItems(1)
     End If
     
  
  End Sub

好的,这样就可以把图片路径放到一个未绑定的文本框中了。

到目前为止我们有这个:

现在,请注意保存到数据库按钮。该按钮的代码如下所示:

  Private Sub cmdSaveToDB_Click()
  
     ' save current record
     If Me.Dirty Then Me.Dirty = False
     
     Dim MyImage() As Byte
     
     MyImage = GetFileBytes(Me.txtFile)
     
     Me!ImageB = MyImage
     Me.Dirty = False
     
  End Sub

我们还需要这个二进制文件读取例程——它使用文本框中的路径名

  Public Function GetFileBytes(ByVal path As String) As Byte()
  
      Dim lngFileNum      As Long
      Dim bytRtnVal()     As Byte
      lngFileNum = FreeFile
      
      If LenB(Dir(path)) Then ''// Does file exist?
          Open path For Binary Access Read As lngFileNum
          ReDim bytRtnVal(LOF(lngFileNum) - 1&) As Byte
          Get lngFileNum, , bytRtnVal
          Close lngFileNum
      Else
          Err.Raise 53
      End If
      
      GetFileBytes = bytRtnVal
      
      Erase bytRtnVal
  
  
  End Function

就是这样。

如前所述,唯一的问题是我们无法将图片框直接绑定到表单数据源。

但是,你可以这样做:

所以,在上面,放了一个按钮来显示图片。

看起来像这样:

Private Sub cmdShowFromDB_Click()

   Me.Image1.PictureData = Me.Recordset!ImageB

End Sub

所以,结果现在看起来像这样:

如果您只将表单加载到一个记录,则将代码“设置”在表单加载事件中。

但是,如果您允许导航,那么您必须使用 on-current 来自动显示图像。

但是,至少现在有了新的图像控件(我认为是 2010 年??),那么您不需要很多特殊代码。

所以上面将二进制图片(原始)保存到sql server:

【讨论】:

对不起,伙计,我正在处理这段代码,我在下面的代码行中遇到了错误 MyImage = GetfileBytes(Me.TxtFile) 我收到错误 Compile error: sub or function not定义我不是一个强大的程序员,我完全是自学的,所以我有点挣扎。 好吧,在同一个代码模块中,您必须放置 GetFileBytes() 例程。然后 GetFileBytes 可以在其他代码例程中用作(调用)函数。 对不起,伙计,我不明白你的意思。抱歉,我知识贫乏。 好吧,我按照你上面说的做了,但是现在不知道怎么称呼? 好吧,既然你把那个辅助函数放在同一个代码模块中,那么你的 GetFileBytes() 错误就不会再发生了。因此,您可以为测试在表单上放置一个按钮来保存图片。然后为了测试,在表单上放一个按钮来加载图片。所以这个表格将用于“暂存”图片。因此,此表格将用于将图片添加和保存到数据库中。不清楚是否所有用户都需要这个能力,或者一个特殊的人会加载+保存图片到数据库。然而,虽然上面确实将图片保存到数据库,但通常最好只保存路径名。

以上是关于使用 SQL Server 后端将图片插入到 Access 表中的主要内容,如果未能解决你的问题,请参考以下文章

插入到 SQL Server 中的视图中

MS Access 表单不允许添加 SQL Server 后端

如何使用 Ruby 作为后端将 React 上的图像上传到 Google Cloud Storage

在 Azure 移动应用服务后端将字符串属性反序列化为 Json 对象

使用 express 后端将 create-react-app 部署到 heroku 在浏览器中返回无效的主机标头

如何以 Node JS 作为后端将 Mysql 数据获取并显示到 ReactJS 前端?