【问题标题】:Too many arguments passed to Stored Procedure storing image太多参数传递给存储过程存储图像
【发布时间】:2020-12-14 03:12:03
【问题描述】:

我正在尝试将 JPG 图像存储到 MSSQL Server 2014。图像路径被传递到存储过程中,proc 中的部分过程是将图像存储到VARBINARY(MAX) 字段中(我无法更改架构)。我的第一次尝试是在这样的同一个过程中:

DECLARE @pictureSql VARCHAR(300)

SET @pictureSql = 'INSERT INTO PictureBinary
(PictureId, BinaryData)
SELECT ' + CAST(@ImgId AS Varchar) +', * FROM OPENROWSET(BULK ''' + 
@ImgPath1 + ''', SINGLE_BLOB) rs'

EXEC(@pictureSql)

尽管来自PRINT() 语句的命令按预期执行,但在存储过程中执行它时遇到了问题。这是一个 VARCHAR 转换错误,几乎导致笔记本电脑上了一堂飞行课,但我正在进行的部分研究建议将此位分解为一个单独的存储过程。在没有真正理解推理逻辑的情况下,我绝望地走上了这条路。同样的问题。

然后我更改了存储过程以接受二进制数据并通过调用应用程序将其传递。我基于this

(精简版)

ALTER PROCEDURE [dbo].[usp_InsertImage] @ProductId INT, 
@imagePath NVARCHAR(300), 
@mimeType VARCHAR(40), 
@seoFilename NVARCHAR(300), 
@altTag NVARCHAR(300), 
@titleTag NVARCHAR(300), 
@ImgData VARBINARY(MAX)
AS
BEGIN


    DECLARE @Id INTEGER

    SET @imagePath = REPLACE(@imagePath, '''', '''''')
    SET @seoFilename = REPLACE(@seoFilename, '''', '''''')
    SET @altTag = REPLACE(@altTag, '''', '''''')
    SET @titleTag = REPLACE(@titleTag, '''', '''''')

    DECLARE @ImgId INT

    INSERT INTO dbo.Picture
    (MimeType, SeoFilename, AltAttribute, TitleAttribute, IsNew, VirtualPath)
    VALUES (@mimeType, @seoFilename, @altTag, @titleTag, 0, NULL )

    SELECT @ImgId = SCOPE_IDENTITY()

    INSERT INTO dbo.PictureBinary (PictureId, BinaryData)   
VALUES (@ProductId, @ImgData)

    INSERT dbo.Product_Picture_Mapping (ProductId, PictureId, DisplayOrder) 
VALUES (@ProductId, @ImgId, 1)

    SELECT @id;
END

从另一个 SP 调用它是这样的:

DECLARE @childResult INT

EXEC @childResult = dbo.usp_InsertImage  
@ProductId = @ProductID, 
@imagePath  = @ImgPath1, 
@mimeType = 'image/jpeg', 
@seoFilename =  @SeoFilename1, 
@altTag = @ProductName, 
@titleTag = @ProductName, 
@ImgData = @ImgBinary1

也尝试过未命名的参数:

EXEC @childResult = dbo.usp_InsertImage  
@ProductID, 
@ImgPath1, 
N'image/jpeg', 
@SeoFilename1, 
@ProductName, 
@ProductName, 
@ImgBinary1

无论我尝试什么,我都会得到同样的错误:

过程或函数 usp_InsertImage 指定了太多参数。

我已经到了一个地步,我什至不确定我是否接近这是正确的方法,这似乎比它应该的更令人恼火。要么那个,要么我是一个完全的木板,错过了一些明显的东西,它有 50/50 的机会。

这只是开发代码,但有人能告诉我这种方法是否正确吗?

【问题讨论】:

    标签: sql stored-procedures sql-server-2014


    【解决方案1】:

    错误消息表明您已连接到未更新过程定义的不同数据库(或不同实例)。请检查您的连接字符串(并确保您正在使用的任何东西都没有像AttachDbFileName 这样的东西 - 这意味着它正在使用它自己的、不同的数据库文件副本)。有关详细信息,请参阅 thisthis

    您可以通过以下方式确认您的调用代码没有连接到不同的数据库:

    • 将过程定义更改为具有太多必需的参数,并查看错误消息是否更改。
    • 更改过程的名称,看看你现有的代码是否还能找到它。
    • 使用不同的名称创建该过程的副本,然后更改您的代码以查看它是否找到了新对象。

    【讨论】:

    • 在我没有触及的部分代码中留下了一些调试代码,连接字符串被硬设置。我想知道你的连接字符串在配置中是正确的是不够的。谢谢
    猜你喜欢
    • 2011-07-12
    • 2016-04-05
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多