Capitolo 41. NET_SDF

 41.1 Creazione di un File SDF

I Files a standard "SDF" (Strutturati) sono dei Database che utilizzano campi di lunghezze fisse per memorizzare i dati. Sono quindi  anch'essi dei contenitori di dati  come i files "MDF".

                                                                                                                                                                                                                                              

La differenza e' che essi sono fisicamente disponibili e trasportabili al contrario degli "MDF" che sono invece inglobati nel sistema SQL EXPRESS e sono accesibili solo in locale o tramite rete. Assomigliano qindi di piu' ai database MDB che abbiamo studiato fin dall'inizio del nostro lavoro.

 

Questi Database possono essere maneggiati dal Tool Management Studio, pero' solo in versione 2008

Questo Tool dispone di meno strumenti di quelli disponibili per gli "MDF".  Ad esempio possono essere visualizzati, creati e modificati con istruzioni SQL ma non possono importare i dati di un altro Database, in particolare MDB, come abbiamo visto per il SQL EXPRESS.

 

Per installare il Tool Management Studio 2008 occorre lanciare il SQL Express with Tools SQLEXPRWT_x64_ITA versione 2008.

L'installazione e' abbastanza fastidiosa. Diamo di seguito alcuni suggerimenti:

 

Quando l'installazione richiede il nome dell'Account, dare "NT AUTHORITY\SYSTEM:

 

 

Nel passaggio successivo quando chiede la "Specifica degli amministratori di SQL Server" battere il bottone "Aggiungi". Si ottiene un piccolo riquadro in cui  si chiede di "Immettere i nomi degli oggetti da selezionare. Scrivere "ADMINISTRATOR" e po il bottone "Controlla nomi"

 

 

Il risultato del controllo aggiunge il nome del Computer su cui si lavora (nel nostro caso si trattava di: LAPTOP 5LG eccetera). Questo nome viene quindi trasferito nella "Specifica amministratori di SQL Server".

 

Al termine dell'installazione abbiamo finalmente il Tool 2008 il quale ha la caratteristica di poter lavorare con il "SQL Server Compact" che e' l'unico capace di  gestire i files SDF. Versioni successive del Tool non dispongono di questo accesso, forse perchež Microsoft ha abbandonato questi tipo di files.

 

 

Comunque, come anticipato sopra, a causa della scarsita' di strumenti del Tool 2008, se vogliamo un "MAGFILE.SDF" corrispondente al "MAGFILE.MDB" , dobbiamo costruircelo da soli. Vediamo allora un esercizio che provveda a questa operazione, limitandoci  pero' alla sola Tabella "ARTFILE" e lavorando in ambiente VB.NET.

Per prima cosa bisogna preparare la struttura vuota del Database SDF vuoto: Si avvii il Tool Management Studio ed alla richiesta di connettersi si scelga come "Motore di Database" il "SQL Server Compact Edition" e nalla tendina "File di database" si selezioni "Nuovo database" .

Si seguano i passi richiesti e si crei un "MAGFILE.SDF" nella solita Cartella "C:\GRIGLIE_ADO\ARCHIVIODATI".

Al termine dell' operazione, battendo sul cilindro del Database/Tabelle con il tasto destro si possono aggiungere nuove tabelle. Limitiamoci ad "ARTFILE. Si aggiungano manualmente, una per una, tante colonne quante ne conosciamo per l'"ARTFILE" del "MDB".

A questo punto possiamo esercitarci con il linguaggio SQL. Si batta su "Nuova Query" e si provino ad esempio le semplici istruzioni:

INSERT INTO ARTFILE (ARTCODI,ARTNOME) VALUES (1,'PRIMO')

SELECT * FROM ARTFILE

UPDATE ARTFILE SET ARTCODI=2, ARTNOME='SECONDO'  WHERE ARTCODI=2

DELETE FROM ARTFILE WHERE ARTCODI=2

DELETE FROM ARTFILE (svuota la Tabella)

Si faccia attenzione a mettere il "WHERE" dove serve. Naturalmente ad ogni nuova query bisogna battere il bottone di esecuzione.

 

 41.2 Aperura di un SDF

Il SQL Compact non offre nessuna utility per importare dati da altri Database, come invece abbiamo potuto vedere nel Capitolo precedente.

Bisogna allora rimboccarsi le maniche: prepariamo una nuova Cartella "ESERCIZIO_38_NET_SDF" per aprire in essa un nuovo progetto VB.NET che chiameremo "Project1"

Copiamo da un altro progetto, per esempio quello della cartella "SOLUZIONE_01_NET_Grid". Modifichiamo il "FORM1" come segue lasciando solo due Bottoni:

Sono necessarie alcune dichiarazioni all'inizio di Classe del "FORM1".

Imports System.Data.OleDb

Imports System.Data.SqlServerCe

 

Public Class Form1

 

    'generali SDF

    '-----------------------

    Dim pathsdf As String

    Dim CnSDF As New SqlCeConnection

    Dim Ds_MAGFILE As New DataSet

    Dim dsNewRow As DataRow

 

    'ARTFILE SDF

    '-------------------------

    Dim SelezART As String

    Dim Da_ARTFILE As New SqlCeDataAdapter

    Dim Dt_ARTFILE As New DataTable

    Dim Cb_ARTFILE As New SqlCeCommandBuilder

    Dim Rs22 As New BindingSource

    Dim MaxRowsArt As Integer

 

   

Il primo Bottone opera l'apertura del Recordset/DataSet SDF ( a nome RS22) nel DataGridView

   Private Sub cmdRECORDSET_Click(sender As System.Object, e As System.EventArgs) Handles cmdRECORDSET.Click

 

        'Connessione SDF

        '---------------------

        pathsdf = "C:\GRIGLIE_ADO\ARCHIVIODATI\MAGFILE.SDF"

        CnSDF = New SqlCeConnection("Data Source =  " & pathsdf & "")

 

        'Dataset SDF

        '----------------------

        CnSDF.Open()

        SelezART = "Select * from ARTFILE"

        Da_ARTFILE = New SqlCeDataAdapter(SelezART, CnSDF)

        Da_ARTFILE.Fill(Ds_MAGFILE, "MAGFILE")

        CnSDF.Close()

 

        'Table SDF

        '---------------------

        Da_ARTFILE.Fill(Dt_ARTFILE)

        Cb_ARTFILE = New SqlCeCommandBuilder(Da_ARTFILE)

        Rs22.DataSource = Dt_ARTFILE

        MaxRowsArt = Ds_MAGFILE.Tables("MAGFILE").Rows.Count

 

        'DataGridView()

        '---------------------

        DataGridView1.DataSource = Rs11

        cmdRECORDSET.Enabled = False

 

    End Sub

Come si vede si tratta della solita struttura di apertura solo che qui si usano comandi "SQLCE" che devono quindi sostituire tutti i comandi "OLEDB" dalle Routines eventualmente copiate dall'Esercizio 01.

Tuttavia modificare le istruzioni non basta. Occorre anche modificare la configurazione del progetto per renderlo capace di lavorare sotto SQL CE.Per fare questo occorre fare un passaggio aggiungendo con il Menu' "DATI" un "Nuovo Database". Si seguono le istruzioni e si aggiunge naturalmente "MAGFILE.SDF in C:\GRIGLIE_ADO\ARCHIVIODATI".

Dopo questo passaggio il progetto e' abilitato e si possono tranquillamente eliminare gli oggetti aggiunti:

 

E' importante notare che a questo punto il Project1 e' in grado di maneggiare "SDF" posti ovunque lo si desideri. La posizione del "SDF" va indicata nella variabile "PATHSDF" come sopra indicato.

Se ora lanciamo il Project1, il DataGrid mostrera' la Tabella vuota oppure i records che eventualmente avremo aggiunto con le prove del paragrafo precedente.

 

 41.3 Transfer dati da MDB a SDF

Per trasferire i dati da "ARTFILE/MDB" ad "ARTFILE/SDF" necessitiamo di una seconda Connessione, questa volta al vecchio "MAGFILE.MDB" ed un secodo Recorset che chiameremo "RS11" per distinguerlo dall' "RS22" del SDF. Aggiungiamo allora le necessarie dichiarazioni anch'esse all'inizio di classe Form1:

 'generali MDB

    '-----------------------

    Dim pathmdb As String

    Dim CnMDB As New OleDbConnection

    Dim Ds_MAGFILEMDB As New DataSet

    Dim dsNewRowMDB As DataRow

 

    'ARTFILE MDB

    '-------------------------

    Dim SelezARTMDB As String

    Dim Da_ARTFILEMDB As New OleDbDataAdapter

    Dim Dt_ARTFILEMDB As New DataTable

    Dim Cb_ARTFILEMDB As New OleDbCommandBuilder

    Dim Rs11 As New BindingSource

    Dim MaxRowsArtMDB As Integer

 

Passiamo ora al Bottome "CMDBUILD". In esso si procede per prima cosa all'apertura della Tabella "ARTFILE" del MDB

Private Sub cmdBuild_Click(sender As System.Object, e As System.EventArgs) Handles cmdBuild.Click

 

        'Connessione MDB

        '---------------------

        pathmdb = "C:/GRIGLIE_ADO/ARCHIVIODATI/MAGFILE.MDB"

        CnMDB.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source = " & pathmdb & ""

 

        'Dataset MDB

        '----------------------

        CnMDB.Open()

        SelezARTMDB = "Select * from ARTFILE"

        Da_ARTFILEMDB = New OleDbDataAdapter(SelezARTMDB, CnMDB)

        Da_ARTFILEMDB.Fill(Ds_MAGFILEMDB, "MAGFILE")

        CnMDB.Close()

 

        'Table MDB

        '---------------------

        Da_ARTFILEMDB.Fill(Dt_ARTFILEMDB)

        Cb_ARTFILEMDB = New OleDbCommandBuilder(Da_ARTFILEMDB)

        Rs11.DataSource = Dt_ARTFILEMDB

        MaxRowsArtMDB = Ds_MAGFILEMDB.Tables("MAGFILE").Rows.Count

        cmdRECORDSET.Enabled = False

 

Si procede poi a trasferire i dati di "ARTFILE" MDB, Recordset Rs11,  in "ARTFILE" SDF:

'ciclo

        '------------------------------------------

        Rs11.Position = 0

        Do While Rs11.Position < MaxRowsArtMDB - 1

 

            'crea una Row

            '----------

            Dim dsNewRow = Ds_MAGFILE.Tables("MAGFILE").NewRow()

 

            dsNewRow.Item("ARTCODI") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("ARTCODI")

            dsNewRow.Item("DATAGG") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("DATAGG")

            dsNewRow.Item("ARTNOME") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("ARTNOME")

            dsNewRow.Item("TIPO") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("TIPO")

            dsNewRow.Item("UM") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("UM")

            dsNewRow.Item("STOCK") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("STOCK")

            dsNewRow.Item("COSBANETTO") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("COSBANETTO")

            dsNewRow.Item("PROCOGN") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("PROCOGN")

            dsNewRow.Item("PRONOME") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("PRONOME")

            dsNewRow.Item("ALIVA") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("ALIVA")

            dsNewRow.Item("IVABASE") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("IVABASE")

            dsNewRow.Item("COSBALORDO") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("COSBALORDO")

            dsNewRow.Item("ARTQTY") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("ARTQTY")

            dsNewRow.Item("OK") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("OK")

            dsNewRow.Item("NETTOVERO") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("NETTOVERO")

            dsNewRow.Item("TOTNETTO") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("TOTNETTO")

 

            'aggiunge il Record

            '-------------

            Ds_MAGFILE.Tables("MAGFILE").Rows.Add(dsNewRow)

            Da_ARTFILE.Update(Ds_MAGFILE, "MAGFILE")

 

            Rs11.MoveNext()

        Loop

 

        End

    End Sub

 La Routine termina con un "END". Riaprendo il progetto si nota che l'"ARTFILE/SDF" si e' riempito con tutti i records dell'"ARTFILE/MDB". Missione compiuta.

 

 41.4 Apertura di un Progetto completo

Se vogliamo ora vedere il nostro SDF in azione su un progetto .NET vero, possiamo copiare l'intero ESERCIZIO_08_09_10_NET (previa rinomina della Cartella "Project1" a "Project2" ) dentro la Cartella del nostro Esercizio 38.

Operiamo anche qui le necessarie modifiche: "OLEDB" --> "SQLCE" , aggiungiamo la libreria SQL CE,  aggiungiamo temporaneamente il Database "MAGFILE.SDF" ed osserviamo alla fine che il Progetto gira nello stesso modo che sotto "MDB" o anche sotto "MDF".

Ecco comunque un link a Microsoft se si vuole distribuire un Progetto con Database SDF:

https://msdn.microsoft.com/it-it/library/aa983340(v=vs.100).aspx
 

41.5 Transfer completo di MAGFILE a SDF

L'esercizio precedente era basato sull'apertura della tabella "ARTFILE", la sola che abbiamo trasferito nel "MAGFILE.SDF".

Ci poniamo ora l'obiettivo di trasferire tutte le Tabelle di "MAGFILE.MDB" al "MAGFILE.SDF".

Per fare questo ci serve (oltre che un bel po' di pazienza) un altro strumento:

Per prima cosa si noti che il modo con cui abbiamo scritto il Progetto del presente Esercizio  permette una rapida sostituzione di "ARTFILE" con qualunque altra Tabella, per esempio "CLIFILE, "FOUFILE, etc.

Vediamo ora lo  strumento di cui abbiamo bisogno. Si tratta di una Routine del "MAKETEXTSDF" simile alla "MAKETEXT" che abbiamo visto al Capitolo 7 , Esercizio 07 a cui si rimanda per i dettagli.

In pratica occorre preparare una nuova vartella "MAKETEXTSDF", sempre all'interno della nostra cartella madre, la "C:\GRIGLIE_ADO", e copiare al suo interno tutto il contenuto della "MAKETXT".

Dopo poche modifice di maquillage (riferimenti alla Cartella di destinazione dei testi, Captions etc) si passa alla Routine del Bottone di creazione testi ("CMDTEXT")  in cui avremo eliminato tutte le parti relative al Files "MDB". Cominciamo col creare la prima Routine "SDF" : si tratta  di farci scrivere dal programma la Routine necessaria al trasferimento dei dati del Recorset/Dataset MDM a nome "11" al corrispondente Dataset SDF.

La Routine per la preparazione delle istruzioni necessarie Tabella per Tabella ("ART", "CLI", "FOU", etc) sono le seguenti:

'XXX_NET_SDF
'----------------
Open Trim(txtTesti) & "\" & XXX & "SDF.TXT" For Output As #1
Print #1, "Sub " & XXX & "sdf()"
Print #1, ""

Set txtdb = OpenDatabase(DDD, False, False, "")
txttab = "select * from " & XXX & "FILE"
Set txtrcset = txtdb.OpenRecordset(txttab)

For i = 0 To txtrcset.Fields.Count - 2
'--
If txtrcset.Fields(i).Name <> "FLIPRETE" Then
'-------
nome = txtrcset.Fields(i).Name
DIME = txtrcset.Fields(i).Size

testo = "dsNewRow.Item(" & Chr(34) & nome & Chr(34) & ") = " & _
"Ds_" & Text3 & "MDB" & ".Tables(" & Chr(34) & Text3 & Chr(34) & ").Rows(" & _
"Rs" & "11.Position).Item(" & Chr(34) & nome & Chr(34) & ")"

'-------
End If 'FLIPRETE
'--
Print #1, testo
Next

Print #1, ""
Print #1, "End Sub "
Close #1

Lanciando il Progetto e selezionando per esempio la tabella "CLIFILE viene generato un File .TXT (CLI_NET_SDF.TXT)  leggibile con il Notepad, come questo:

Sub CLI_NET_SDF()

dsNewRow.Item("CLICODI") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("CLICODI")
dsNewRow.Item("CLINOME") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("CLINOME")
dsNewRow.Item("DATAGG") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("DATAGG")
dsNewRow.Item("INDIR") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("INDIR")
dsNewRow.Item("CAP") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("CAP")
dsNewRow.Item("CITTA") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("CITTA")
dsNewRow.Item("PR") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("PR")
dsNewRow.Item("CODFIS") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("CODFIS")
dsNewRow.Item("PIVA") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("PIVA")
dsNewRow.Item("TELEFO1") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("TELEFO1")
dsNewRow.Item("TELEFO2") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("TELEFO2")
dsNewRow.Item("NOTA") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("NOTA")

End Sub

Come si vede, si tratta di istruzioni molto simili a quelle viste sopra per il trasferimento della tabella "ARTFILE", nel senso che qui vengono elencati tutti i Fields di "CLIFILE" al posto di quelli di "ARTFILE".

Procediao allora ad aprire il SQL Server management Studio e connettiamoci al "MAGFILE.SDF" creato negli esercizi precedenti.

Aggiungiamo una nuova Tabella "CLIFILE" (tasto destro del mouse) e definiamo i campi, magari aiutandoci con il File "STRU.TXT" anch'esso creato con l'Utility "MAKETEXTSDF" sopra descritta.

Struttura Database C:\GRIGLIE_ADO\ARCHIVIODATI\MAGFILE.MDB

 

........

 

CLIFILE

-------------------------------------

CLICODI          N.Double       8

CLINOME        Carattere      30

DATAGG         Data              8

INDIR              Carattere       40

CAP                 Carattere        5

CITTA             Carattere       25

PR                   Carattere        3

CODFIS          Carattere       16

PIVA               Carattere       11

TELEFO1        Carattere      20

TELEFO2        Carattere      20

NOTA             Carattere      20

FLIPRETE       N.Double      8

 

Creata la Tabella, ritorniamo al nostro Project1 in VB.NET ed operiamo come segue:

   - Con un Ctrl-H cambiamo tutti gli "ARTFILE in "CLIFILE"

   - Sostituiamo le istruzioni di transfer Tabella ("MDB" a "SDF") con quelle disponibile sul File .TX creato con l'Utility "MAKETEXTSDF":

Allora la Routine "CMDBUILD" diviene:

    Private Sub cmdBuild_Click(sender As System.Object, e As System.EventArgs) Handles cmdBuild.Click

 

        'Connessione MDB

        '---------------------

        pathmdb = "C:/GRIGLIE_ADO/ARCHIVIODATI/MAGFILE.MDB"

        CnMDB.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source = " & pathmdb & ""

 

        'Dataset MDB

        '----------------------

        CnMDB.Open()

        SelezARTMDB = "Select * from CLIFILE"

        Da_CLIFILEMDB = New OleDbDataAdapter(SelezARTMDB, CnMDB)

        Da_CLIFILEMDB.Fill(Ds_MAGFILEMDB, "MAGFILE")

        CnMDB.Close()

 

        'Table MDB

        '---------------------

        Da_CLIFILEMDB.Fill(Dt_CLIFILEMDB)

        Cb_CLIFILEMDB = New OleDbCommandBuilder(Da_CLIFILEMDB)

        Rs11.DataSource = Dt_CLIFILEMDB

        MaxRowsArtMDB = Ds_MAGFILEMDB.Tables("MAGFILE").Rows.Count

        cmdRECORDSET.Enabled = False

 

        'ciclo

        '------------------------------------------

        Rs11.Position = 0

        Do While Rs11.Position < MaxRowsArtMDB - 1

 

            'crea una Row

            '----------

            Dim dsNewRow = Ds_MAGFILE.Tables("MAGFILE").NewRow()

            dsNewRow.Item("CLICODI") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("CLICODI")

            dsNewRow.Item("CLINOME") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("CLINOME")

            dsNewRow.Item("DATAGG") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("DATAGG")

            dsNewRow.Item("INDIR") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("INDIR")

            dsNewRow.Item("CAP") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("CAP")

            dsNewRow.Item("CITTA") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("CITTA")

            dsNewRow.Item("PR") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("PR")

            dsNewRow.Item("CODFIS") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("CODFIS")

            dsNewRow.Item("PIVA") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("PIVA")

            dsNewRow.Item("TELEFO1") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("TELEFO1")

            dsNewRow.Item("TELEFO2") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("TELEFO2")

            dsNewRow.Item("NOTA") = Ds_MAGFILEMDB.Tables("MAGFILE").Rows(Rs11.Position).Item("NOTA")

  

            'aggiunge il Record

            '-------------

            Ds_MAGFILE.Tables("MAGFILE").Rows.Add(dsNewRow)

            Da_CLIFILE.Update(Ds_MAGFILE, "MAGFILE")

 

            Rs11.MoveNext()

        Loop

 

        End

    End Sub

 

Lanciando il Progetto si riempie la Tabella "CLIFILE" di "MAGFILE.SF" con i records della stessa Tabella di "MAGFILE.MDB".

E' purtroppo necessario ripetere il procedimento sopra descritto per tutte le Tabelle, ma alla fine abbiamo il nostro "MAGFILE.SDF" completo.

 

 

Fine del Capitolo 41. NET_SDF