MS Access:将图像作为varbinary发送到存储过程

时间:2018-03-02 21:15:06

标签: sql-server ms-access access-vba

齿轮: MS Access 2016, SQL Server 2014

语言 VBA, T-SQL

问题: 该项目是一个“商店”,使用MS ACCESS作为连接到SQL Server的前端,当向数据库(SQL Server数据库)添加项目时,我还需要添加项目的图像。所以我之前做的是能够将独立图像添加到数据库中的Images表,该表有2个字段,AUTO id为整数,ImageData为VARBINARY(MAX)。

为了将图像添加到数据库,我创建了一个存储过程,其中一个参数为VarBinary(MAX),应该能够超过8k字节,但是当我发送更多8k字节时,我收到错误消息“[ SQL Server Native Client 11.0]字符串数据,右截断“。

在线研究问题并没有解决我的问题,我发现可能是数据太大并且要解决它我应该将可变大小更改为MAX指示可能超过8k字节的数据

这是试用版VBA代码,用于将存储过程与图像一起使用:

Dim Connection As New ADODB.Connection
Dim strm As new ADODB.stream
strm.Type = adTypeBinary
strm.Open
strm.LoadFromFile "C:\out.png"
strm.Position = 0

Connection.Open 'Connection string that should not be published'
If Connection.State = 1 Then
    Dim cmd As New ADODB.command
    Set cmd.ActiveConnection = Connection
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "InsertImage"
    cmd.Parameters("@image").Size = -1
    cmd.Parameters("@image").Value = strm.Read

    If Not IsNull(cmd.Parameters("@image").Value) Then cmd.Execute ' Crushes on execute
End If

这是存储过程:

USE [Supply]
GO
ALTER PROCEDURE [dbo].[InsertImage]
(
    @image as VARBINARY(MAX)
)
AS
BEGIN
    INSERT INTO Images values(@image)
    SELECT Scope_Identify()
END

当使用少于8k字节的图像时,上述过程可以正常工作,或者在SQL Server Management Studio中执行以下脚本时图像权重超过8k字节:

INSERT INTO Images
SELECT * FROM OPENROWSET(BULK 'C:\out.png', SINGLE_BLOB) as img

1 个答案:

答案 0 :(得分:0)

最后,我使用上面的存储过程来"初始化"数据库中的图像,然后创建另一个接收图像ID和更多数据的过程,然后连接数据与数据连接,同时添加表老化机制,以便数据不会再次更改并破坏图像数据库中。