0

我有一个 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 转换为图像吗?

4

2 回答 2

1

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

于 2012-12-05T18:11:00.857 回答
0

最安全的方法是将图像作为字节数组上传:

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);
于 2012-12-04T15:12:34.357 回答