Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

SQL Server Compact, il motore di SQL Server in meno di 2 MB

Le caratteristiche principali di SQL CE, il DBMS compatto per il mobile e piccole applicazioni
Le caratteristiche principali di SQL CE, il DBMS compatto per il mobile e piccole applicazioni
Link copiato negli appunti

Per gestire una modesta quantità di dati, un DBMS del calibro di SQL Server potrebbe risultare eccessivo. Ad esempio, un'applicazione client per Windows, destinata alla gestione di una rubrica telefonica o della lista dei nostri brani musicali preferiti, a meno di esigenze particolari, non necessita di tutta la potenza offerta da SQL Server: in questo caso, infatti, sarebbe sufficiente un semplice sistema per la memorizzazione e il recupero dei dati, senza "strumenti aggiuntivi" come supporto multi-utente, piani di manutenzione, attività schedulate, etc. In altri contesti, inoltre, potremmo non avere a disposizione le risorse hardware necessarie per l'installazione e l'esecuzione di SQL Server, come nel caso di applicazioni per la piattaforma Windows Mobile, in cui la quantità di RAM e la potenza di elaborazione sono limitate.

In tutti questi casi ci viene in aiuto SQL Server Compact Edition (abbreviato solitamente in SQL CE), una "versione ridotta" di SQL Server, che possiede un sottoinsieme di funzionalità del fratello maggiore. La piattaforma risulta estremamente compatta (il database engine occupa circa 2 MB), pensata per la gestione di basi di dati locali utilizzate da applicazioni desktop e mobili.

Installazione e caratteristiche

SQL Server Compact 3.5 viene distribuito insieme a Visual Studio 2008. È però possibile scaricare gratuitamente la versione 3.5 SP1, compatibile anche con Visual Studio 2005 e, tra le altre novità, aggiunge il supporto ai nuovi di dato introdotti da SQL Server 2008 (date, time, datetime2, datetimeoffset, geography, e geometry). La documentazione di SQL CE, comprendente il Book online e gli esempi di utilizzo, deve essere invece scaricata a parte.

Il setup è molto veloce e richiede solo di indicare il percorso di installazione, che di default è:

C:Program FilesMicrosoft SQL Server Compact Edition

Come accennato prima, infatti, l'intero database engine risiede in una manciata di file DLL che, complessivamente, occupa circa 2 MB. A differenza delle versioni maggiori di SQL Server, il motore di SQL CE viene eseguito in-process, ovvero all'interno dell'applicazione che lo utilizza. La memorizzazione dei dati è basata su file: ogni database risiede in un singolo file (tipicamente con estensione .SDF), per cui, per distribuirlo o effettuarne copie di backup, è sufficiente fare la copia di questo archivio. La dimensione massima di un database è di 4 GB (come per SQL Server Express Edition).

I database di SQL CE sono conformi alle cosiddette caratteristiche ACID (Atomicità, Coerenza, Isolamento e Durabilità, detta anche Persistenza). Il DBMS supporta pienamente gli indici sulle tabelle, le transazioni, i vincoli di integrità referenziale, i lock sui dati e le connessioni multiple alla stessa sorgente dati. Sono inclusi anche il motore per gestire la replica dei dati ed un query processor in grado di ottimizzare l'esecuzione delle interrogazioni.

Manca, invece, la possibilità di creare stored procedure, funzioni, viste e trigger, così come il supporto al tipo di dati XML.

I database possono essere cifrati con una chiave a 128 bit, per aumentarne la sicurezza. Non sono però previsti altri meccanismi di protezione, come un sistema di sicurezza basato sui ruoli: conoscendo la password del database, sarà possibile accedere a tutti i dati in esso contenuti.

Per la gestione dei database di SQL CE, è possibile utilizzare SQL Server Management Studio 2008 oppure il Server Explorer di Visual Studio 2008 SP1. Di quest'ultimo ci occuperemo tra poco. Per collegarsi ad un database di SQL CE dal Management Studio, invece, si deve selezionare la voce SQL Server Compact Edition tra le opzioni di Server type, nella finestra di dialogo Connect to Server, quindi utilizzare Database file per selezionare un database esistente oppure crearne uno nuovo:

Figura 1. Connessione ad un DB SQL CE con Management Studio
SQL Server Management Studio per la connessione ad un database di SQL Server Compact

Dopo aver inserito l'eventuale password e stabilito la connessione con un clic su Connect, sarà possibile gestire il database come qualunque altra sorgente dati all'interno del Management Studio.

SQL Server Compact per i programmatori .NET

Dal punto di vista della programmazione, SQL Server Compact è fornito insieme ad un provider per ADO.NET, grazie a cui gli sviluppatori .NET hanno la possibilità di accedere alla sorgente dati utilizzando il classico meccanismo basato su Connection, Command, DataReader, etc. Inoltre, sono supportati sia LINQ sia l'Entity Framework (aggiunto nella versione 3.5 SP1).

Infine, sempre da Microsoft Downloads, è possibile scaricare il runtime di SQL Server Compact per Windows Mobile, che contiene un file in formato CAB con cui installare le librerie necessarie all'esecuzione del DBMS sui dispositivi Windows Mobile (sono supportati Windows CE 4.2 o superiore, Windows Mobile 2003 per Pocket PC e Windows Mobile 5.0 o superiore).

Per maggiori informazioni su SQL Server Compact , si consiglia di fare riferimento al sito ufficiale (in lingua inglese). In particolare, è possibile scaricare un interessante documento in cui vengono illustrati gli scenari tipici di utilizzo di questa versione del DBMS.

Vediamo ora un semplice esempio di utilizzo di SQL Server Compact per la gestione di una rubrica telefonica all'interno di un'applicazione Windows per desktop. Allo scopo, ci serviremo di Visual Studio 2008 SP1 (per un'introduzione a questo strumento, si rimanda alla guida pubblicata su html.it). Avviamo l'ambiente di sviluppo e creiamo una nuova applicazione Console con C#, a cui assegniamo il nome TestSqlCe. Ora apriamo il Server Explorer e facciamo clic sul pulsante Connect to Database:

Figura 2. Il Server Explorer di Visual Studio 2008
Il Server Explorer di Visual Studio 2008

Nella finestra di dialogo Add Connection, premiamo il pulsante Change, quindi selezioniamo Microsoft SQL Server Compact 3.5 , poi OK. Adesso con il pulsante Create definiamo il nuovo database. Assegniamo al DB il nome AddressBook e impostiamo una password, ad esempio 1provaperhtml.it:

Figura 3. Creare di un nuovo sdatabase SQL CE
La finestra di dialogo per la creazione di un nuovo database di SQL Server Compact

Premiamo due volte OK per confermare la creazione del database.

Clicchiamo con il tasto destro su AddressBook.sdf nel Server Explorer e selezioniamo New query, per creare le tabelle della nostra rubrica e popolarle con qualche dato di prova, utilizzando lo script Create.sql allegato a questo articolo.

Figura 4. Lo schema del database creato
Lo schema del database creato

A questo punto, possiamo scrivere il codice del nostro esempio. La modalità di accesso al database è praticamente la stessa cui siamo abituati con le versioni maggiori di SQL Server (cambiano solo i nomi delle classi da utilizzare). Per il nostro esempio, ci serviremo di una connessione classica (Connection, Command, DataReader, etc.) perché l'utilizzo di LINQ-to-SQL o ADO.NET Entity Framework nasconderebbe tutti i dettagli che invece vogliamo evidenziare.

Aggiungiamo al progetto il riferimento all'assembly che contiene le classi necessarie per l'accesso ai database di SQL CE. Clicchiamo su Add Reference del menu Project e scorriamo l'elenco per selezionare System.Data.SqlServerCe e con OK. Ora apriamo il file Program.cs e aggiungiamo la clausola using:

using System.Data.SqlServerCe;

Portiamoci poi nella routine Main e scriviamo il seguente codice:

string dbFile = @"D:UsersMarcoDocumentsAddressBook.sdf";
string password = "1provaperhtml.it";

// Crea la connessione al database
string connectionString = string.Format("Data Source={0};Password={1};Persist Security Info=False", dbFile, password);
SqlCeConnection conn = new SqlCeConnection(connectionString);
conn.Open();

// Prepara un comando SQL
SqlCeCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT u.Name, u.Address, c.Name AS CityName 
                  FROM Users u INNER JOIN Cities C ON u.IDCity = c.IDCity
                  ORDER BY u.Name";

using (SqlCeDataReader reader = cmd.ExecuteReader())
{
    //Enumera tutti i contatti
    while (reader.Read())
    {
        string name = reader["Name"].ToString();
        string address = reader["Address"].ToString();
        string city = reader["CityName"].ToString();
        Console.WriteLine("{0}, {1} ({2})", name, address, city);
    }
}

// Inserisce un nuovo contatto
Console.WriteLine("nInserisco un nuovo contatto nel database...");

cmd.CommandText = "INSERT INTO Users(Name, Address, IDCity) VALUES(@Name, @Address, @IDCity)";
SqlCeParameter namePar = cmd.CreateParameter();
namePar.ParameterName = "@Name";
namePar.Value = "Qui, Quo, Qua";
SqlCeParameter addressPar = cmd.CreateParameter();
addressPar.ParameterName = "@Address";
addressPar.Value = "Via Sfortunata 313";
SqlCeParameter cityPar = cmd.CreateParameter();
cityPar.ParameterName = "@IDCity";
cityPar.Value = 1;
cmd.Parameters.AddRange(new SqlCeParameter[] { namePar, addressPar, cityPar });
cmd.ExecuteNonQuery();

Console.WriteLine("Nuovo contatto inserito con successo.");

// Libera le risorse
cmd.Dispose();
conn.Dispose();

Console.ReadKey();

La connessione al database è aperta attraverso un oggetto di tipo SqlCeConnection, a cui passiamo come argomento l'opportuna stringa di inizializzazione (la variabile dbFile deve essere modificata facendola puntare al percorso nel proprio sistema, mentre password deve contenere la parola chiave definita in fase di creazione del DB, 1provaperhtml.it in questo esempio).

Utilizziamo poi un SqlCeCommand per recuperare l'elenco di tutti i contatti della rubrica, ordinati per nome. Il successivo ciclo, attraverso un SqlCeDataReader, ci permette di enumerare e stampare gli utenti trovati. Infine, inseriamo un nuovo record nel database, servendoci del classico meccanismo dei parametri di SQL Server (in questo caso l'oggetto da utilizzare si chiama SqlCeParameter).

Figura 5. Il risultato dell'esecuzione
Il risultato dell'esecuzione del nostro programma di prova

L'utilizzo degli oggetti SqlCe* è funzionalmente equivalente alle classi utilizzate per l'accesso alle versioni maggiori di SQL Server. Ad esempio, se avessimo voluto utilizzare anche le transazioni, avremmo semplicemente dovuto instanziare un oggetto di tipo SqlCeTransaction e assegnarlo alla proprietà Transaction dell'oggetto SqlCeCommand.

Conclusioni

Abbiamo analizzato le principali caratteristiche di SQL CE, una versione "ridotta all'osso" di SQL Server pensata per gestire piccole basi di dati, tipicamente in applicazioni desktop o per dispositivi Windows Mobile, senza impegnare risorse per un DBMS molto potente. L'approccio per gli sviluppatori è praticamente identico alle altre versioni di SQL Server, annullando i tempi di apprendimento. (Purtroppo non è uno strumento adatto al Web, ndR).

Ti consigliamo anche