传递给存储图像的存储过程的参数太多
Too many arguments passed to Stored Procedure storing image
我正在尝试将 JPG 图像存储到 MSSQL Server 2014
。图像路径被传递到存储过程中,过程中的部分过程是将图像存储到 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
无论我尝试什么,我都会得到同样的错误:
Procedure or function usp_InsertImage has too many arguments specified.
我已经到了一个地步,我什至不确定我正在接近这是正确的方法,它似乎比它应该的更令人恼火。要么是那个,要么我是一个完全的木板并且遗漏了一些明显的东西,这是 50/50 的机会。
这只是开发代码,但有人可以告诉我这种方法是否正确吗?
错误消息表明您连接到另一个数据库(或不同的实例),其中过程的定义尚未更新。请检查您的连接字符串(并确保您正在使用的任何东西都没有做类似 AttachDbFileName
的事情 - 这意味着它正在使用它自己的数据库文件的不同副本)。有关详细信息,请参阅 this and this。
您可以通过以下方式确认您的调用代码不是连接到不同的数据库:
- 更改过程定义以具有太多 个所需参数,并查看错误消息是否更改。
- 更改过程的名称,看看您现有的代码是否还能找到它。
- 使用不同的名称创建该过程的副本,并更改您的代码以查看它是否找到新对象。
我正在尝试将 JPG 图像存储到 MSSQL Server 2014
。图像路径被传递到存储过程中,过程中的部分过程是将图像存储到 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
无论我尝试什么,我都会得到同样的错误:
Procedure or function usp_InsertImage has too many arguments specified.
我已经到了一个地步,我什至不确定我正在接近这是正确的方法,它似乎比它应该的更令人恼火。要么是那个,要么我是一个完全的木板并且遗漏了一些明显的东西,这是 50/50 的机会。
这只是开发代码,但有人可以告诉我这种方法是否正确吗?
错误消息表明您连接到另一个数据库(或不同的实例),其中过程的定义尚未更新。请检查您的连接字符串(并确保您正在使用的任何东西都没有做类似 AttachDbFileName
的事情 - 这意味着它正在使用它自己的数据库文件的不同副本)。有关详细信息,请参阅 this and this。
您可以通过以下方式确认您的调用代码不是连接到不同的数据库:
- 更改过程定义以具有太多 个所需参数,并查看错误消息是否更改。
- 更改过程的名称,看看您现有的代码是否还能找到它。
- 使用不同的名称创建该过程的副本,并更改您的代码以查看它是否找到新对象。