我正在尝试将表单(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
答案 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
请注意,在加载图片时,您不需要三个单独的查询 - 您可以执行一个查询,返回三列,然后从相关列中提取每个图像。