Как сохранить изображения в столбце varbinary (max)? - PullRequest
6 голосов
/ 06 сентября 2011

Я получаю следующее исключение sql при вставке изображения в sql server 2008.

Неявное преобразование из типа данных nvarchar в varbinary (max) не допускается.Используйте функцию CONVERT для выполнения этого запроса

В базе данных Тип данных столбца - Varbinary (MAX).

Редактировать

Код снятиз комментария

paramaters.Add(getParam("@imageFilePath", DbType.AnsiString, imageFilePath));

Ответы [ 4 ]

13 голосов
/ 06 сентября 2011

Используйте это для чтения файла в байтовый массив:

    // Old fashioned way
    public static byte[] ReadFile(string filePath)
    {
        byte[] buffer;
        FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
        try
        {
            int length = (int)fileStream.Length;  // get file length
            buffer = new byte[length];            // create buffer
            int count;                            // actual number of bytes read
            int sum = 0;                          // total number of bytes read

            // read until Read method returns 0 (end of the stream has been reached)
            while ((count = fileStream.Read(buffer, sum, length - sum)) > 0)
                sum += count;  // sum is a buffer offset for next reading
        }
        finally
        {
            fileStream.Close();
        }
        return buffer;
    }

или

    // Thanks Magnus!
    byte[] data = System.IO.File.ReadAllBytes(filePath);

Затем сохраните данные изображения, используя это (я использую класс изображения "instance"который содержит мою информацию об изображении и байтовый массив в instance.Data):

   using(SqlCommand cm = new SqlCommand("SaveImage", connection, transaction)){
       cm.CommandType = CommandType.StoredProcedure;
       cm.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int,0, ParameterDirection.InputOutput, false, 10, 0, "Id", DataRowVersion.Current, (SqlInt32)instance.Id));
       cm.Parameters.Add(new SqlParameter("@Title", SqlDbType.NVarChar,50, ParameterDirection.Input, false, 0, 0, "Title", DataRowVersion.Current, (SqlString)instance.Title));
       if (instance.Data.Length > 0)
       {
           cm.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary,instance.Data.Length, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, (SqlBinary)instance.Data));
       }
       else
       {
           cm.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary,0, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, DBNull.Value));                    
       }

       cm.ExecuteNonQuery();
   )

А вот пример хранимой процедуры:

CREATE PROCEDURE SaveImage
(
@Id int OUTPUT 
,@Title nvarchar(50)
,@Data varbinary(MAX)
)
AS
SET NOCOUNT ON
SET XACT_ABORT ON

IF @Id IS NULL OR @Id <= 0
BEGIN
SELECT @Id = ISNULL(MAX([Id]),0) + 1 FROM [dbo].[Images]
END

INSERT INTO [dbo].[Images] (
[Id]
,[Title]
,[Data]
) VALUES (
@Id
,@Title
,@Data
)
4 голосов
/ 06 сентября 2011

Вы получаете ошибку, потому что пытаетесь вставить текст в столбец varbinary (max); следовательно, вы сохраняете не изображение, а ПУТЬ к изображению.

Если вы хотите сохранить только PATH , измените тип столбца с varbinary (max) на varchar (max) Если вы хотите сохранить ИЗОБРАЖЕНИЕ БАЙТОВ , вам нужен код для чтения изображения из файла в виде байтового массива, а затем вставьте данные следующим образом:

byte [] buffer = File.ReadAllBytes("Path/to/your/image/");
...

SqlCommand command = ....
command.CommandType=CommandType.StoredProcedure;
command.Parameters.AddWithValue("@image",buffer);
command.ExecuteNonQuery();

или

SqlCommand command = ....
command.Text="INSERT INTO YOUR_TABLE_NAME (image) values (@image)";
command.Parameters.AddWithValue("@image",buffer);
command.ExecuteNonQuery();
2 голосов
/ 06 сентября 2011

Похоже, вы пытаетесь установить для данных изображения столбец, для которого задан тип данных NVARCHAR (основной текст).Либо установите для данных изображения правильный столбец VARBINARY (MAX), либо добавьте этот столбец в таблицу, если он еще не существует.Или вы можете изменить текущий используемый столбец на тип данных VARBINARY (MAX) с помощью команды ALTER TABLE, если это действительно правильный столбец, и он был просто создан с неверным типом данных для начала.

1 голос
/ 07 сентября 2011

Посмотрите на эти две статьи:

Они показывают не только, как это сделать, но и как сделать это эффективно, используя семантику потока.Наивное решение загрузки всего изображения в байт памяти [] потребует слишком много памяти в вашем процессе ASP.Показанный код использует MVC, но вы можете легко адаптировать его к формам APS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...