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:
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:
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
:
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.
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
).
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).