【问题标题】:Deleting varbinary(MAX) from SQL Server column从 SQL Server 列中删除 varbinary(MAX)
【发布时间】:2014-12-21 18:30:10
【问题描述】:

请先阅读我的完整描述,然后再让我大吃一惊,并指出一个类似但不同的问题描述/解决方案!!

我有一个表(图像),其中包含 2 列 - ID(身份、主键)和 ImageData(varbinary(MAX) 列)。

表定义为:

USE [ImageDB]
GO

/****** Object:  Table [dbo].[Images]    Script Date: 12/21/2014 11:03:08 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Images](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ImageData] [varbinary](max) NULL,
 CONSTRAINT [PK_Images] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

我可以通过主键成功检索这些记录。 我可以从上传的图像文件中成功创建这些记录。

我不能做的是从现有记录中删除 ImageData 列的内容。

我正在尝试使用名为 ClearImage 的存储过程来清空 ImageData 列的内容:

USE [ImageDB]
GO
/****** Object:  StoredProcedure [dbo].[ClearImage]    Script Date: 12/21/2014 11:06:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ClearImage]
(
@id     int,
@image varbinary(max)
)
AS
Begin
UPDATE Images
SET  ImageData = @image 
WHERE ID = @id
END

我正在执行的代码(最后一次测试)是:

SqlConnection connection = new SqlConnection();
connection.ConnectionString = "Initial Catalog=ImageDB;Data Source=XXXXXXXXXX;Persist Security Info=False;user id=YYYYYY;password=ZZZZZZZZZZ;";
connection.Open();
SqlCommand command = new SqlCommand("ClearImage", connection);
command.Parameters.Add("@id", System.Data.SqlDbType.Int).Value = Convert.ToInt32(ClearKey.Text);
command.Parameters.Add("@image", System.Data.SqlDbType.VarBinary).Value = System.DBNull.Value;
command.ExecuteScalar();
connection.Close();
connection.Dispose();

我一直收到的错误(无论我尝试做什么): 过程或函数“ClearImage”需要参数“@id”,但未提供。

请记住,我有足够的经验来确保我已经提供了@id 参数(并确保它是数据库中存在的记录的有效整数键值)。

我在这里(包括 18170985 和其他)和其他地方阅读了许多论坛条目,但没有一个可以解决我的问题。我已经为此工作了几个小时无济于事。

有谁知道它为什么给我这个晦涩(且不正确)的错误消息?我在 Visual Studio 2013 中运行并使用 SQL Server 2008 数据库。

由于限制,我无法发布命令参数的屏幕截图,但请相信我,这两个参数都存在,名称正确,等等。

提前致谢!

林恩

【问题讨论】:

  • 我会使用 SQL 分析器来准确检查正在执行的 SQL。
  • 该消息远非晦涩难懂,它实际上指出了问题所在。因为您没有指示服务器命令文本中的“ClearImage”是一个存储过程。您发送的参数实际上根本没有被使用。

标签: sql-server sql-server-2008 tsql varbinarymax


【解决方案1】:

您遇到的异常有两个可能的原因:

  1. 要么没有提供参数,要么
  2. 未指定命令类型。

由于您的情况 [1] 被排除,您必须明确指定命令类型。所以在这一行之后:

SqlCommand command = new SqlCommand("ClearImage", connection);

只需添加:

command.CommandType = CommandType.StoredProcedure;

【讨论】:

  • 你是对的。我自己找到了它,然后当我回来关闭它时找到了你的答案。无论如何,感谢您的帮助。您对丢失的“命令类型”以及为什么我没有看到它是完全正确的,这超出了我的范围——除了我一定是在寻找困难的东西而不是真正愚蠢的东西!
  • @user2247569 我们经常犯这种错误!您可以接受这篇文章作为对您问题的回答,以便其他有类似问题的人可以从这篇文章中受益。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2014-07-29
  • 2021-08-09
  • 2010-11-15
  • 1970-01-01
相关资源
最近更新 更多