在SQL数据库中存储多个图像

时间:2010-08-22 13:34:03

标签: sql vb.net

我正在尝试将表单(PictureBox)中的三个图像存储到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 个答案:

答案 0 :(得分:2)

减少复制的一个简单步骤 - 有一个函数来获取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

请注意,在加载图片时,您不需要三个单独的查询 - 您可以执行一个查询,返回三列,然后从相关列中提取每个图像。