Удаление varbinary(MAX) из столбца SQL Server

Пожалуйста, прочитайте мое полное описание, прежде чем просто взорвать меня и указать на похожее, но другое, описание проблемы / решение!!

У меня есть таблица (изображения), которая содержит 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.

Я не могу опубликовать снимок экрана с параметрами команды из-за ограничений, но, пожалуйста, поверьте мне, оба параметра присутствуют, правильно названы и т. Д.

Заранее спасибо!

Линн

1 ответ

Исключение, которое вы испытываете, имеет две вероятные причины:

  1. Либо не был указан параметр ИЛИ
  2. Тип команды не указан.

Поскольку в вашем случае [1] исключено, вы должны явно указать тип команды. Итак, после этой строки:

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

просто добавьте:

command.CommandType = CommandType.StoredProcedure;
Другие вопросы по тегам