【问题标题】:MS Access: Sending image as varbinary to stored procedureMS Access:将图像作为 varbinary 发送到存储过程
【发布时间】:2018-03-08 22:23:05
【问题描述】:

装备: 微软访问 2016, SQL Server 2014

语言: VBA, T-SQL

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

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

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

这是使用带有图像的存储过程的试用 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

【问题讨论】:

    标签: sql-server ms-access vba


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      相关资源
      最近更新 更多