Как сохранить образ Telerik RadBinaryImage в базе данных SQL Server

У меня есть элемент управления Telerik RadBinaryImage, который отображает изображение, загруженное с помощью Telerik RadAsyncUpload.

У меня есть таблица SQL, содержащая столбец "Фото" (тип данных изображения). Я хочу сохранить в базе данных изображение из Telerik RadBinaryImage в функцию вставки, которая выглядит следующим образом:

Private Sub InsertPhotoIntoDB()
        Dim sMyConn As String = My.Settings.appDBConnString
        Dim myConnection As SqlConnection
        Dim myCommand As New SqlCommand
        myConnection = New SqlConnection(sMyConn)

        myConnection.Open()

        myCommand = New SqlCommand("INSERT INTO Photos(Photo) VALUES(@Photo)")
        myCommand.Connection = myConnection

        myCommand.Parameters.Add("@Photo", SqlDbType.Image, 0, "Photo")
        myCommand.Parameters("@Photo").Value = WhatDoIPutHere???

        myCommand.ExecuteNonQuery()

        myConnection.Close()
        myConnection.Dispose()
End Sub

Я пробовал:myCommand.Parameters.Add("@Photo", SqlDbType.Image).Value = RadBinaryImage1.DataValue но я все еще получаю ошибку:

Параметризованный запрос '(@Photo image)INSERT INTO Photos (Photo) VALUES (@Photo)' ожидает параметр '@Photo', который не был предоставлен.

Нужно ли конвертировать RadBinaryImage1.DataValue в изображение?

2 ответа

RadBinaryImage Элемент управления используется для отображения изображения, поступающего из базы данных. Итак, последовательность должна быть такой:

  1. Пользователь загружает фото через RadUpload
  2. Изображение хранится в базе данных с использованием модифицированного кода (см. Ниже)
  3. На PostBack страница отображает изображение из базы данных, используя RadBinaryImage

Если вы не хотите сразу хранить в базе данных, вам нужно каким-то образом сохранить данные самостоятельно (можно сохранить файл в файловой системе, а затем получить доступ к пути через RadBinaryImage.SavedImageNameили сохраняться в памяти как Session["UploadedImage"]). Суть в том, что RadBinaryImage предназначен только для отображения изображения на странице.

Что касается вашего примера кода, я рекомендую использовать тип столбца SQL varbinary вместо image,

 Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
         Handles Button1.Click
        For Each file As UploadedFile In RadUpload1.UploadedFiles
            Dim bytes(file.ContentLength - 1) As Byte
            file.InputStream.Read(bytes, 0, file.ContentLength)
            Dim connection As OleDbConnection = CreateConnection()
            Try
                Dim command As New OleDbCommand("INSERT INTO Images ([Name], [Size], [Content]) VALUES (?, ?, ?)", connection)
                command.Parameters.AddWithValue("@Name", file.GetName())
                command.Parameters.AddWithValue("@Size", bytes.Length)
                command.Parameters.AddWithValue("@Content", bytes)
                connection.Open()
                command.ExecuteNonQuery()
            Finally
                If connection.State = Data.ConnectionState.Open Then
                    connection.Close()
                End If
            End Try
        Next
    End Sub

См. Этот пост для примера кода и более подробного объяснения: http://www.telerik.com/help/aspnet-ajax/upload-manipulating-files.html

Самый безопасный способ - загрузить изображение в виде байтового массива:

Byte[] yourByteArray; 
...
myCommand.Parameters.AddWithValue("@Photo", yourByteArray);

Как добраться до байтового массива отличается. С помощью элемента управления ASP.NET Upload это просто:

yourByteArray = FileUpload1.FileBytes;

Или, если изображение представлено в виде потока:

var yourByteArray = new Byte[ImageObject.InputStream.Length];
ImageObject.InputStream.Read(yourByteArray, 0, yourByteArray.Length);
Другие вопросы по тегам