Co je SQL Server Compact Edition ?
Microsoft SQL server ve své edici Compact Edition je určen pro použití v jednodušších aplikacích pro Windows na PC či Smart Device, kde se počet záznamů nevyšplhává do milionových hodnot, ale zůstává spíše u hodnot v řádech tisíců. Velice důležitý rozdíl oproti ostatním edicím tohoto databázového stroje spočívá hlavně v tom, že neběží jako služba, ale je představován pouze a jedině databázovým souborem s příponou SDF. Tato skutečnost ho tedy předurčuje k embedded použití, podobně jako například případě databázi Firebird Embedded, kde je distribuce relační databáze s vlastní aplikací velice jednoduchá a databáze je používána pouze danou aplikací. Runtime kompaktní edice SQL serveru má velikost pouhých 1,7 MB a od chvíle jeho instalace mohou všechny aplikace na počítači využívat jeho služeb pro přístup k SDF databázím. To tedy znamená, že na daném počítači je potřeba zajistit instalaci tohoto runtime.
Edice Compact Edition poskytuje omezenou množinu funkčností z „větších“ brášků, ale i tato množina je dle mého názoru dostačující pro potřeby realizace aplikací typu databáze CD či filmů, pro které je edice primárně určena. Mezi podporované funkčnosti mimo jiné patří:
· možnost definovat pohledy
· používat vnořené SELECT klauzule
· podpora základních datových typů (INT, SMALLINT, TINYINT, BIGINT, BIT, DATETIME, NUMERIC, REAL, FLOAT, MONEY, NVARCHAR, NCHAR, NTEXT, UNIQUEIDENTIFIER, VARBINARY, BINARY, IMAGE)
· referenční integrita
· vlastnost IDENTITY
Očekávat však nemůžeme vlastnosti jako uložené procedury či triggery. Databáze může být chráněna heslem a také může být zašifrována. Více o možnostech této edice je možné se dočíst v SQL Server Compact Books Online, které jsou stejně jako samotná databáze k dispozici zdarma ke stažení (viz. Odkazy na zdroje) .
Pro tvorbu schématu databáze při vývoji je možné použít SQL Server Management Studio (i Express) SP2 nebo výborné integrované podpory v novém vývojovém prostředí Visual Studio 2008.

Dialog pro připojení v SQL Server Management Studiu - je nutné zvolit typ serveru Compact Edtion
Já osobně jsem preferoval práci ve Visual Studiu 2008, kde jsem měl k dispozici vše, co jsem potřeboval.
Použití z Visual Studio 2008
Ve Visual Studio 2008 lze velmi pohodlně pracovat s databázemi SQL Serveru Compact Edition, pomocí známého panelu Server Explorer. Skrze tento panel lze vytvořit nový soubor s databází, následně definovat či mazat jednotlivé tabulky a vztahy mezi nimi a také zobrazovat a editovat jejich obsah.
Novou databázi v prostředí Visual Studio 2008 vytvoříme pomocí volby „Add Connection..“ na uzlu seznamu databázových připojení, kde v následném dialogu nesmíme zapomenout zvolit .NET managed provider pro SQL Server Compact Edition.

Dialog pro přidání DB konexe do Server Exploreru VS 2008, pomocí kterého lze vytvořit novou DB SQL Server Compact Edition.

Dialog tvorby nové DB pro SQL Server Compact Edition ve VS 2008.
Po vytvoření databáze můžeme směle pokročit k pohodlné definici tabulek a jejich případných vazeb. Obě tyto akce jsou představovány separátními akcemi na uzlu databáze v Server Exploreru („Table Properties“ a „Edit Table Schema“).

Prostředí pro definici tabulky ve VS 2008

Definice relací mezi tabulkami ve VS 2008
Přístup pomocí ADO .NET
Nyní, když už víme co nám SQL Server Compact Edition může nabídnout, přejdeme k možnému použití z platformy .NET. Komponenta ADO .NET je již v .NET frameworku obsažena nějaký ten pátek, takže nepokládám za nutné ji představovat. Pokud budeme chtít pracovat z ADO .NET z databázemi kompaktního SQL serveru, tak budeme využívat služeb tříd ze jmenného prostoru System.Data.SqlServerCe, který je obsažen v implementaci .NET data provideru pro SQL Server Compact Edition. Tento .NET data provider je představován assembly System.Data.SqlServerCe, která je do systému nainstalována v době instalace SQL Server Compact Edition Runtime. Ve zmíněném jmenném prostoru jsou nám k dispozici typy jako SqlCeConnection, SqlCeCommand, SqlCeDataReader, SqlCeDataAdapter a tak dále. Tyto typy použijeme k implementaci datového přístupu pomocí zažitých idiomů.
string connectionString = GetConnectionString();
SqlCeConnection connection = new SqlCeConnection(connectionString);
SqlCeDataAdapter adapter = new SqlCeDataAdapter("select * from movies", connection);
DataTable moviesTable = new DataTable();
try
{
adapter.Fill(moviesTable);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), ex.Message);
}
moviesView.DataSource = moviesTable;
Connection string, který se používá pro připojení k databázi SQL Serveru Compact Edition z .NET je v následujícím jednoduchém tvaru.
Data Source=[cesta k SDF souboru];Password=[heslo]
V případě, že daná databáze má být pro aplikaci vytvořena programově, například při prvním spuštění na daném počítači, použijeme služeb tříd SqlCeEngine. Tato třída na sobě nese instanční metodu CreateDatabase, která zajistí vytvoření databázového SDF souboru podle parametrů v connection stringu, který je jí nastaven pomocí konstruktoru nebo vlastnosti LocalConnectionString.
if (!File.Exists(DB_FILE))
{
SqlCeEngine engine = new SqlCeEngine();
//nastavit connection string
engine.LocalConnectionString = GetConnectionString();
//vytvoreni DB souboru
engine.CreateDatabase();
//pripadne zajisteni vytvoreni tabulek pomoci DDL
CreateTables();
}
Použití LINQ to SQL
Na rozdíl od výše zmiňované komponenty ADO .NET, LINQ je poměrně čerstvou novinkou v oblasti přístupu k datům, která vyšla na svět spolu s .NET frameworkem 3.5. Stručně řečeno, LINQ je integrovaná podpora dotazování do programovacího jazyku. V současnosti tuto podporu nalezneme v jazycích C# 3.0 a VB9, kde můžeme nalézt nová klíčová slova známá z jazyku SQL (select, from, where …). Velkou výhodou této integrace dotazování do jazyku je mimo jiné kontrola dotazů v době kompilace.
LINQ to SQL je jednou z více částí tohoto pozoruhodného projektu, která zajišťuje O-R mapování mezi tabulkami z SQL databáze (zatím jen SQL server) a aplikačními objekty. Dobrou zprávou je, že LINQ můžeme použít i k práci s daty, jež jsou uložena v databázi SQL Serveru Compact Edition. Horší zprávou je, že není možné použít pohodlný LINQ to SQL designér, který je známý z použití s vyššími verzemi SQL serveru, tím pádem se kombinace SQL Server Compact Edition a LINQ to SQL trochu komplikuje.
Cesta k řešení je představována command-line utilitou s názvem sqlmetal.exe. Pomocí této utility, kterou můžeme nalézt na cestě [disk]\ Program Files\Microsoft SDKs\Windows\v6.0A\Bin, je možné nechat vygenerovat soubor obsahující pro LINQ to SQL životně důležitou třídu odvozenou od typu DataContext. Použití utitility sqlmetal.exe pro vygenerování zmíněné třídy je následující:
sqlmetal [cesta k souboru SDF] /code:[soubor výsledné třídy] /password:[heslo k DB]
tedy například:
sqlmetal "C:\Dokumenty\movies.sdf" /code:moviesDb.cs /password:heslo
Když máme třídu vygenerovanou, zařadíme ji do našeho projektu a přidáme v projektu reference na potřebné assembly (System.Core, System.Data.Linq), pokud v projektu ještě nejsou. Název třídy datového kontextu je odvozen dle názvu databáze, takže pokud se databáze jmenuje movies, jméno vygenerované třídy bude Movies.
[System.Data.Linq.Mapping.DatabaseAttribute(Name="movies")]
public partial class Movies : System.Data.Linq.DataContext
{
…
}
Překážku k zdárnému použití LINQ to SQL s naší kompaktní databází jsme překonali, takže směle můžeme využívat jednoduchosti a kontroly v compile-time v LINQ. Třeba takovýmto úplně jednoduchým kódem pro získání všech filmů z databáze.
string connectionString = GetConnectionString();
Movies moviesDb = new Movies(connectionString);
var allMovies = from m in moviesDb.MoviesTable select m;
moviesView.DataSource = allMovies;
Závěr
SQL Server Compact Edition představuje velmi zajímavou variantu embedded databáze pro použití v jednodušších aplikacích na platformě Windows. Při vývoji je k dispozici komfort v podobě integrovaného použití z prostředí Visual Studio 2008, kde lze zvládnout všechny základní operace s databází. Jako zatím u jediné embedded databáze lze k přístupu z .NET aplikace použít nejen ADO .NET , ale také nový LINQ.
Odkazy na zdroje
SQL Server Compact a Visual Studio 2008 :
Projekt LINQ :