2010-08-22 3 views
1

Я пытаюсь сохранить три изображения из формы (PictureBox's) в базу данных 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 изображения или вы хотите, чтобы добавить больше. –

+0

Theres шанс добавить больше изображений в будущем, хотя это будет просто еще один PictureBox или два. – madlan

ответ

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 

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

Смежные вопросы