Как сохранить образ 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
Элемент управления используется для отображения изображения, поступающего из базы данных. Итак, последовательность должна быть такой:
- Пользователь загружает фото через
RadUpload
- Изображение хранится в базе данных с использованием модифицированного кода (см. Ниже)
- На 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);