Ivan Gentile

Office and .NET blog
posts - 24, comments - 0, trackbacks - 2

Caricare e recuperare immagini in un db SQL Server 2005 in VB.Net

Ogni volta che ci troviamo a lavorare con un database e con immagini collegate ad ogni elemento della tabella, nasce il solito dilemma!!!

Come mi comporto con le immagini??

Memorizzo solo la path o l’immagine intera??

La risposta solitamente è:

MEGLIO SOLO LA PATH!!!

Un po’ per comodità e soprattutto perché memorizzare le immagini in un db sembra complicato!!

Vi garantisco che non lo è per niente … e spero che non lo sia più nemmeno per voi dopo aver letto questo mio post!!

 

Innanzitutto dobbiamo creare il DB e la Tabella, allora eccovi gli script per farlo:

 

‘CREAZIONE DB

 

CREATE DATABASE [Test] ON  PRIMARY

( NAME = N'Test', FILENAME = N'c:\Programmi\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Test.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )

 LOG ON

( NAME = N'Test_log', FILENAME = N'c:\Programmi\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Test_log.ldf' , SIZE = 7616KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)

 COLLATE Latin1_General_CI_AS

 

‘CREAZIONE TABELLA

 

USE [Test]

GO

CREATE TABLE [dbo].[Album](

         [IdFoto] [int] IDENTITY(1,1) NOT NULL,

         [Foto] [image] NULL,

 CONSTRAINT [PK_Album] PRIMARY KEY CLUSTERED

(

         [IdFoto] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

 

Per chi fosse meno esperto di SQL Server 2005:

-          aprire SQL Server Management;

-          cliccare su “New Query …” basta copiare ed incollare lo script per la creazione del DB ed eseguire la query;

-          cliccare su “New Query … ” copiare ed incollare lo script per la creazione della tabella ed eseguire la query.

 

Ora il DB Test e la sua cartella Album dovrebbero essere stati creati.

 

Passiamo all’implementazione del codice. Sviluppiamo un piccolo programmino per la memorizzazione e la visualizzazione delle immagini nel DB appena creato.

 

Apriamo VSTO 2005 e iniziamo un nuovo progetto.

 

Nel primo form inseriamo una Toolstrip e su di essa inseriamo due pulsanti. Inseriamo poi una Label nella parte del form che rimane libera e dovremmo ottenere una cosa del genere:

 

 

Passando al codice inseriamo questo che segue:

 

Imports System

Imports Microsoft.VisualBasic

 

Public Class Form3

    Dim testo As String = "Demo di DB Image con SQL " _

                        & "Server 2005 in VB.Net"

 

    Private Sub Timer1_Tick(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles Timer1.Tick

        If Label1.Text.Length <> 0 Then

            Label1.Text = Microsoft.VisualBasic.Right(Label1.Text, _

                          Label1.Text.Length - 1)

        Else

            Label1.Text = testo

        End If

    End Sub

 

    Private Sub ToolStripButton1_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles ToolStripButton1.Click

        Dim frmCarica As New Caricamento

        frmCarica.ShowDialog()

    End Sub

 

    Private Sub ToolStripButton2_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles ToolStripButton2.Click

        Dim frmVedi As New Visualizza

        frmVedi.ShowDialog()

    End Sub

End Class

 

Inseriamo ora un nuovo Form che chiameremo Caricamento. In questo inseriamo una PictureBox, una TextBox, una OpenFileDialog e due Button. Lavorando un po’ con il designer potreste ottenere questo:

 

 

Il codice da aggiungere a questo form è:

 

Imports System

Imports System.IO

Imports System.Data

Imports System.Data.SqlClient

 

Public Class Caricamento

    Dim Archivio As SqlConnection

 

    Private Sub Form1_Load(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles MyBase.Load

        Archivio = New SqlConnection

        Archivio.ConnectionString = "Data Source=(local)\SQLEXPRESS;" _

                          & "Database=Test;Integrated Security=SSPI;"

    End Sub

 

    Private Sub Button1_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles Button1.Click

        OpenFileDialog1.Filter = "BMP - Bitmap Windows | *.bmp | " _

        & "GIF - CompuServe Graphics Interchange | *.gif | JPG - " _

        & "Compatibile JFIF | *.jpg"

        OpenFileDialog1.Title = "Seleziona l'immagine da caricare ..."

        OpenFileDialog1.ShowDialog()

        If OpenFileDialog1.FileName <> "" Then

            TextBox1.Text = OpenFileDialog1.FileName.ToString

            PictureBox1.Image = Image.FromFile _

              (OpenFileDialog1.FileName.ToString)

        End If

    End Sub

 

    Private Function ImageToStream() As Byte()

        Dim Image As New Bitmap(TextBox1.Text)

        Dim stream As MemoryStream = New MemoryStream()

        Image.Save(stream, _

        System.Drawing.Imaging.ImageFormat.Bmp)

        Return stream.ToArray()

    End Function

 

    Private Sub Button2_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles Button2.Click

        If File.Exists(TextBox1.Text) Then

            Dim Query As String

            Query = "INSERT INTO Album (Foto) VALUES (@Img)"

            Dim comando As New SqlCommand(Query, Archivio)

            Archivio.Open()

            Dim param As SqlParameter = _

               New SqlParameter("@Img", SqlDbType.Binary)

            param.Value = ImageToStream()

            comando.Parameters.Add(param)

            comando.ExecuteNonQuery()

            comando = Nothing

            Archivio.Close()

            PictureBox1.Image = Nothing

            TextBox1.Text = ""

        Else

            MessageBox.Show("File inesistente!!", "Test DB Image", _

               MessageBoxButtons.OK, MessageBoxIcon.Exclamation, _

               MessageBoxDefaultButton.Button1, _

               MessageBoxOptions.DefaultDesktopOnly)

        End If

    End Sub

End Class

 

Inseriamo ancora un altro Form che chiameremo Visualizza. Inseriamo una Toolstrip con due pulsanti ed una PictureBox per ottenere questo.

 

 

Con questo codice:

 

Imports System

Imports System.IO

Imports System.Data

Imports System.Data.SqlClient

 

Public Class Visualizza

    Dim conta As Integer = 1

    Dim Album As New Collection

    Dim Query As String

    Dim Archivio As SqlConnection

 

    Private Sub Form2_Load(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles MyBase.Load

        Archivio = New SqlConnection

        Archivio.ConnectionString = "Data Source=(local)\SQLEXPRESS;" _

                & "Database=Test;Integrated Security=SSPI;"

        Query = "SELECT Foto FROM ALBUM"

        Dim cmd As New SqlCommand(Query, Archivio)

        Archivio.Open()

        Dim I As Integer = 0

        Dim reader As SqlDataReader = cmd.ExecuteReader()

        Dim Temp As Byte()

        While reader.Read

            Temp = reader(0)

            Album.Add(Temp)

        End While

        If Album.Count > 0 Then

            Temp = CType(Album.Item(conta), Byte())

            Dim Img As MemoryStream = New MemoryStream(Temp)

            PictureBox1.Image = Image.FromStream(Img)

        End If

    End Sub

 

    Private Sub ToolStripButton2_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles ToolStripButton2.Click

        Dim Temp As Byte()

 

        If conta > 1 Then

            conta = conta - 1

            Temp = CType(Album.Item(conta), Byte())

            Dim Img As MemoryStream = New MemoryStream(Temp)

            PictureBox1.Image = Image.FromStream(Img)

        End If

    End Sub

 

    Private Sub ToolStripButton1_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles ToolStripButton1.Click

        Dim Temp As Byte()

 

        If conta < Album.Count Then

            conta = conta + 1

            Temp = CType(Album.Item(conta), Byte())

            Dim Img As MemoryStream = New MemoryStream(Temp)

            PictureBox1.Image = Image.FromStream(Img)

        End If

    End Sub

End Class

 

A questo punto siamo pronti per testare l’applicazione.

 

Il risultato dovrebbe essere abbastanza soddisfacente. Infatti se dal form iniziale inseriamo prima un immagine e poi passiamo a visualizzarla dovremmo avere una cosa del genere.

 

 

Confido che almeno i soggetti della foto siano diversi! ;)

 

… sono miei e GUAI A CHI ME LI TOCCA!!

 

Spero di avervi chiarito un po’ le idee.

 

Ciao

 

Ivan

?>

posted on giovedì 9 marzo 2006 15.49