Хранение нескольких изображений в базе данных SQL

Я пытаюсь сохранить три изображения из формы (PictureBox's) в базу данных SQL (MSSQL2008) Я новичок в программировании и испытываю небольшие трудности с упрощением своего кода. Ниже делает то, что я хочу, но явно неэффективно. Есть какие-нибудь указатели на то, что изменить, чтобы улучшить это?

    Private Sub SaveImages()

    Dim ConStr As String = "Data Source=SERVER\SQL2008;Initial Catalog=NorthPole;Integrated Security=True"
    Dim con As New SqlConnection(ConStr)
    Dim sqlCommand As New SqlCommand()
    sqlCommand.Connection = con
    sqlCommand.CommandText = "INSERT INTO Items (ItemID, ItemNumber, ItemImage1, ItemImage2, ItemImage3) SELECT NEWID(), @ItemNumber, @ItemImage1, @ItemImage2, @ItemImage3"

    sqlCommand.Parameters.Add(New SqlParameter("@ItemNumber", SqlDbType.VarChar, 20)).Value = "MS1006"

    Dim ms1 As MemoryStream = New MemoryStream()
    PictureEdit1.Image.Save(ms1, System.Drawing.Imaging.ImageFormat.Jpeg)
    sqlCommand.Parameters.Add(New SqlParameter("@ItemImage1", SqlDbType.VarBinary)).Value = ms1.GetBuffer

    Dim ms2 As MemoryStream = New MemoryStream()
    PictureEdit2.Image.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg)
    sqlCommand.Parameters.Add(New SqlParameter("@ItemImage2", SqlDbType.VarBinary)).Value = ms2.GetBuffer

    Dim ms3 As MemoryStream = New MemoryStream()
    PictureEdit3.Image.Save(ms3, System.Drawing.Imaging.ImageFormat.Jpeg)
    sqlCommand.Parameters.Add(New SqlParameter("@ItemImage3", SqlDbType.VarBinary)).Value = ms3.GetBuffer

    con.Open()
    sqlCommand.ExecuteNonQuery()
    con.Close()

End Sub



Private Sub LoadImages()

    Dim ConStr As String = "Data Source=SERVER\SQL2008;Initial Catalog=NorthPole;Integrated Security=True"
    Dim con As New SqlConnection(ConStr)
    con.Open()
    Dim sqlCommand As New SqlCommand()
    sqlCommand.Connection = con

    sqlCommand.CommandText = "SELECT ItemImage1 FROM items WHERE ItemNumber = 'MS1006'"
    Dim buffer1 As Byte() = sqlCommand.ExecuteScalar()
    Dim ms1 As MemoryStream = New MemoryStream(buffer1)
    PictureEdit1.Image = Image.FromStream(ms1)

    sqlCommand.CommandText = "SELECT ItemImage2 FROM items WHERE ItemNumber = 'MS1006'"
    Dim buffer2 As Byte() = sqlCommand.ExecuteScalar()
    Dim ms2 As MemoryStream = New MemoryStream(buffer2)
    PictureEdit2.Image = Image.FromStream(ms2)

    sqlCommand.CommandText = "SELECT ItemImage3 FROM items WHERE ItemNumber = 'MS1006'"
    Dim buffer3 As Byte() = sqlCommand.ExecuteScalar()
    Dim ms3 As MemoryStream = New MemoryStream(buffer3)
    PictureEdit3.Image = Image.FromStream(ms3)

    con.Close()

End Sub
1
задан madlan 22 August 2010 в 13:34
поделиться

1 ответ

Один простой шаг для сокращения дублирования - есть функция, которая поможет вам байты для ваших jpgs ...

Private Function GetJpegBytesForImage(theImage As Image) As Byte()
    Using ms As MemoryStream = New MemoryStream()
      theImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
      Return ms.GetBuffer()
    End Using
End Function

... аналогично для обратного ...

Private Function GetImageForJpegBytes(theBytes As Byte()) As Image
    Using ms As MemoryStream = New MemoryStream(theBytes)
      return Image.FromStream(ms)
    End Using
End Function

Обратите внимание, что при загрузке изображений вам не нужны три отдельных запроса - вы можете выполнить один запрос, который возвращает три столбцы, а затем извлеките каждое из изображений из соответствующего столбца.

2
ответ дан 2 September 2019 в 21:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: