使用 SQL 服务器后端将图片插入到 Access table
Insert a picture into a Access table with a SQL Server Backend
我需要将图像插入 MS Access 表单(不是 link,因为它是许可证,需要加密和保护)。我有一个 MS Access 前端和一个 SQL 服务器后端。这是插入的代码
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
我有一个包含所有其他数据的 table 和一个名为 LicencePicture1
的列,数据类型设置为 IMAGE
我也尝试将其设置为VARBINARY(MAX)
。谁能指出我做错了什么的正确方向?
嗯,一步一个脚印(加密可以是第 2 部分)。
因此,出于某种原因,varbinary(max) 列不适用于标准 odbc 驱动程序。
但是,如果您创建 sql 服务器图像列,则它 can/will 有效。
第一步?使用新的图像控件 - 而不是功能区中的 oleDB。
所以,选择这个:
接下来,您发现如果将该图像控件绑定到数据库列(链接 table 到 sql 服务器),它将不起作用。
但是,您仍然可以将图像文件(作为原始二进制文件)推入该列,并保存当前记录。
而且还可以显示。
因此,您可以导航到给定的记录,然后说有一个按钮可以浏览到给定的文件 - 与您拥有的类似。
所以,我们有这个:
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
所以,现在的结果是这样的:
如果您只将表单加载到一个 reocrd,则将代码放入表单加载事件中“设置”图像。
但是,如果允许导航,则必须使用on-current来自动显示图像。
但是,至少现在有了新的图像控件(我认为是 2010 年??),那么您就不需要很多特殊代码了。
所以上面将二进制图片(原始)保存到sql服务器:
我需要将图像插入 MS Access 表单(不是 link,因为它是许可证,需要加密和保护)。我有一个 MS Access 前端和一个 SQL 服务器后端。这是插入的代码
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
我有一个包含所有其他数据的 table 和一个名为 LicencePicture1
的列,数据类型设置为 IMAGE
我也尝试将其设置为VARBINARY(MAX)
。谁能指出我做错了什么的正确方向?
嗯,一步一个脚印(加密可以是第 2 部分)。
因此,出于某种原因,varbinary(max) 列不适用于标准 odbc 驱动程序。 但是,如果您创建 sql 服务器图像列,则它 can/will 有效。
第一步?使用新的图像控件 - 而不是功能区中的 oleDB。
所以,选择这个:
接下来,您发现如果将该图像控件绑定到数据库列(链接 table 到 sql 服务器),它将不起作用。
但是,您仍然可以将图像文件(作为原始二进制文件)推入该列,并保存当前记录。
而且还可以显示。
因此,您可以导航到给定的记录,然后说有一个按钮可以浏览到给定的文件 - 与您拥有的类似。
所以,我们有这个:
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
所以,现在的结果是这样的:
如果您只将表单加载到一个 reocrd,则将代码放入表单加载事件中“设置”图像。
但是,如果允许导航,则必须使用on-current来自动显示图像。
但是,至少现在有了新的图像控件(我认为是 2010 年??),那么您就不需要很多特殊代码了。
所以上面将二进制图片(原始)保存到sql服务器: