2010-08-22 6 views
1

Je suis en train de stocker trois images d'un formulaire (PictureBox) dans une base de données SQL (MSSQL2008) Je suis novice en programmation et j'ai un peu de difficulté à simplifier mon code. Le ci-dessous fait ce que je veux mais est clairement inefficace. Des indications sur ce qu'il faut changer pour améliorer cela?Stocker plusieurs images dans la base de données 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

Est-ce que cela ne va jamais à 3 images ou voulez-vous permettre d'en ajouter d'autres. –

+0

Theres une chance d'ajouter plus de picturebox dans le futur, même si ce serait juste un autre PictureBox ou deux. – madlan

Répondre

2

Une simple étape pour réduire la duplication - une fonction pour vous obtenir les octets pour vos 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 

... De même pour l'inverse ...

Private Function GetImageForJpegBytes(theBytes As Byte()) As Image 
    Using ms As MemoryStream = New MemoryStream(theBytes) 
     return Image.FromStream(ms) 
    End Using 
End Function 

Notez que lors du chargement des images, vous n'avez pas besoin de trois requêtes distinctes - vous pouvez effectuer une requête qui ramène les trois colonnes, puis extraire chacune des images de la colonne correspondante.

Questions connexes