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
?>