venerdì 5 agosto 2016

.Net salvare un file in un database Sql Server tramite Visual Basic Net e C#

Si riporta l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_net-46-salvare-un-fine-in-un-db-sql-serv_1457.aspx

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.

Nessun commento: