2010-08-22 23 views
1

我试图从一个窗体(PictureBox的)中存储三个图像到一个SQL数据库(MSSQL2008) 我是编程新手,并且有一点难度简化了我的代码。 下面是我想要的,但显然效率不高。任何改变什么指针来改善这个?在SQL数据库中存储多个图像

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

它只是去3个图像,或者你想使它可以添加更多。 – 2010-08-22 13:44:00

+0

Theres有机会在未来添加更多的picturebox,尽管它只是另一个PictureBox或两个。 – madlan 2010-08-22 13:47:40

回答

2

一个简单的步骤,以减少重复 - 有一个功能,让您的JPG文件的字节数...

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 

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

相关问题