2010-08-22 58 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 

請注意,加載圖像時,您不需要三個單獨的查詢 - 您可以執行一個查詢,將三列返回,然後從相關列中提取每個圖像。

相關問題