Salvare un file in SQL Server tramite VB.Net e C#

Articolo che fornisce le basi per la creazione di un programma gestionale da utilizzare in ambiente Visual Studio.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come salvare un file del nostro pc in un database e precisamente in una base dati basato su servizi, SQL Server.
Inoltre come utilizzare la gestione dei dati tramite Entity Framework, tutto questo verrà realizzato con l’ambiente di sviluppo Visual Studio 2015 utilizzando i linguaggi di programmazione VB.Net e C#.

Creazione del progetto

Prima di tutto, bisogna creare un nuovo progetto di tipo “Windows application”, dovremmo selezionare la voce “Desktop Classico” situata in “Windows”, nel linguaggio di proprio interesse.
A questo punto nella pagina dei modelli (figura 1) selezioneremo la voce “Applicazione Windows Form”.

Figura 1 - La scelta del progetto


Nella form inseriamo un controllo di tipo label, tre controlli di tipo button ed un controllo di tipo “TextBox”, il tutto come mostrato in figura 2

Figura 2 – La form di progettazione.

Ora non ci resta che creare il database.
In esplora soluzione, facciamo click con il tasto destro del mouse sul nome del progetto, nel menu che viene visualizzato selezioniamo la voce “Aggiungi” e poi tramite il sotto menu “Nuovo Elemento”, a questo punto nella finestra che viene aperta, selezioniamo la categoria “Dati” ed il modello “Database basato su servizi”, il tutto come mostrato in figura 3.
A questo punto dobbiamo creare la tabella, che chiameremo “Dati”. La creazione della tabella avviene aprendo il db, tramite doppio click sul file presente nella finestra “Esplora Soluzioni”.

Figura 3 – Il modello di database


Aperta la finestra di esplora server, selezioniamo la voce “Tabella” e facciamo click con il tasto destro, nel menu di scelta rapida selezioniamo “Aggiungi nuova tabella”.
Verrà creata una tabella con un campo denominato “ID” di tipo chiave, aggiungiamo due campi, uno di tipo varchar 50, denominato “NomeFile” e l’altro di tipo “image” con il nome “File”. Questo campo verrà inserito lo stream dei dati.
Il tutto come mostrato in figura 4

Figura 4 – La tabella con i relativi campi


Tramite il pulsante “Update” salviamo le modifiche e poi eseguiamo lo script.
Ora non ci resta che aggiungere l’entity Framework, tasto destro sul nome del progetto in esplora soluzione, e selezioniamo la voce “Aggiungi” e poi “Nuovo Elemento”, a questo punto, nella finestra che viene aperta, selezioniamo la categoria “Dati” e poi il modello di tipo “Ado.Net Entity Data Model”, il tutto come mostrato in figura 3.

Stesura del codice

Abbiamo terminato la progettazione del nostro semplice applicativo gestione, ora dobbiamo scrivere il codice per la selezione del file, il salvataggio dei dati e la relativa creazione del file.
Aggiungiamo lo spazio dei nomi per la gestione dei file e stream.
Qui di seguito tale dichiarazione

VB.Net
Imports System.IO
C#
using System.IO;

Per il pulsante “seleziona”, dobbiamo visualizzare una finestra di dialogo che riporta nella casella di testo il percorso e nome del file.
Qui di seguito le suddette operazioni per entrambi i linguaggi.

VB.Net
Private Sub BtnSeleziona_Click(sender As Object, e As EventArgs) Handles BtnSeleziona.Click
Dim dlgFile As New OpenFileDialog
dlgFile.Title = "Seleziona un file da importare"
dlgFile.Multiselect = False
dlgFile.FileName = ""
dlgFile.ShowDialog()
txtPercorso.Text = dlgFile.FileName
End Sub
C#
private void BtnSeleziona_Click(object sender, EventArgs e)
{
OpenFileDialog dlgFile = new OpenFileDialog();
dlgFile.Title = "Seleziona un file da importare";
dlgFile.Multiselect = false;
dlgFile.FileName = "";
dlgFile.ShowDialog();
txtPercorso.Text = dlgFile.FileName;
}

Per il pulsante “Salva su db” dobbiamo scrivere il codice, che tramite istruzione di entity framework, salva i dati, mettendo nel campo “File” lo stream dati del file, e nel campo “NomeFile” il nome del file.
Qui di seguito il frammento di codice per tale pulsante.

VB.Net
Private Sub btnSalva_Click(sender As Object, e As EventArgs) Handles btnSalva.Click
If (txtPercorso.Text = String.Empty) Then
Return
End If
Dim fs As FileStream = New FileStream(txtPercorso.Text, FileMode.OpenOrCreate, FileAccess.Read)
Dim ImgData() As Byte = New Byte((fs.Length) - 1) {}
fs.Read(ImgData, 0, System.Convert.ToInt32(fs.Length))
fs.Close()
Try
Dim entita As Database1Entities = New Database1Entities
Dim dato As Dati = New Dati
dato.File = ImgData
dato.NomeFile = Path.GetFileName(txtPercorso.Text)
entita.Dati.Add(dato)
entita.SaveChanges()
MessageBox.Show("File salvato con successo")
Catch ex As Exception
MessageBox.Show(("Errore: " + ex.Message))
End Try
End Sub
C#
private void btnSalva_Click(object sender, EventArgs e)
{
if (txtPercorso.Text == string.Empty)
{
return;
}
FileStream fs = new FileStream(txtPercorso.Text, FileMode.OpenOrCreate, FileAccess.Read);
Byte[] ImgData = new Byte[fs.Length];
fs.Read(ImgData, 0, System.Convert.ToInt32(fs.Length));
fs.Close();
try
{
Database1Entities entita = new Database1Entities();
Dati dato = new Dati();
dato.File = ImgData;
dato.NomeFile = Path.GetFileName(txtPercorso.Text);
entita.Dati.Add(dato);
entita.SaveChanges();
MessageBox.Show("File salvato con successo");
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message);
}
}


Siamo giunti a conclusione dell’articolo, dobbiamo scrivere il codice per la generazione dei file, dato lo stream dati salvato sul db, generiamo su un percorso preciso il file.
Qui di seguito il frammento di codice per entrambi i linguaggi.

VB.Net
Private Sub BtnCreaFile_Click(sender As Object, e As EventArgs) Handles BtnCreaFile.Click
Dim fs As FileStream
Dim binaryScrivi As BinaryWriter
Dim outbyte() As Byte = New Byte(((300000 - 1)) - 1) {}
Dim entita As Database1Entities = New Database1Entities
Dim risultato = (From dati In entita.Dati Select dati).ToList()
Dim totale As Integer = risultato.Count
fs = New FileStream(("E:\" + risultato.ToList(0).NomeFile), FileMode.OpenOrCreate, FileAccess.Write)
binaryScrivi = New BinaryWriter(fs)
binaryScrivi.Write(risultato.ToList(0).File)
binaryScrivi.Flush()
binaryScrivi.Close()
fs.Close()
MessageBox.Show(("File creato con successo: " + ("E:\" + risultato.ToList(0).NomeFile)))
End Sub
C#
private void BtnCreaFile_Click(object sender, EventArgs e)
{
FileStream fs;
BinaryWriter binaryScrivi;
Byte[] outbyte = new Byte[300000 - 1];
Database1Entities entita = new Database1Entities();
var risultato = (from dati in entita.Dati select dati).ToList();
int totale = risultato.Count();
fs = new FileStream("E:\\" + risultato.ToList()[0].NomeFile, FileMode.OpenOrCreate, FileAccess.Write);
binaryScrivi = new BinaryWriter(fs);
binaryScrivi.Write(risultato.ToList()[0].File);
binaryScrivi.Flush();
binaryScrivi.Close();
fs.Close();
MessageBox.Show("File creato con successo: " + "E:\\" + risultato.ToList()[0].NomeFile);
}

Conclusioni

L’articolo ha fornito le basi per creare un semplice gestionale, utilizzabile anche come applicativo di tipo gestione documentale, per il salvataggio dei file su un database.
Si è voluto affrontare appositivamente vari scenari, quali utilizzo di entity framework, campi db speciali (image) linq to entity, il tutto con il nuovo ambiente di sviluppo Visual Studio 2015.