Přejít k navigační liště

Zdroják » Databáze » SQL Server Compact 4

SQL Server Compact 4

Články Databáze

V posledních letech si vydobyla velkou popularitu databáze SQLite, a to především díky své nenáročnosti a možnosti „přibalit“ ji k aplikaci a využít jako embedded SQL. I Microsoft má podobnou databázi, kterou lze využít ve spojení např. s IIS či pro desktopové aplikace, nazývanou SQL Server CE.

Nálepky:

Microsoft minulý týden vydal novou verzi své embedded databáze. Předešlé verze této databáze se používaly jen s desktopovými aplikacemi. Nebyla vytvořena tak, aby mohla obsluhovat více požadavků zároveň. To se v nové verzi změnilo. Dá se bez obav z pádu či uváznutí používat z více vláken současně. Tím se pole její působnosti výrazně rozšířilo o nasazení na webových serverech. Databázi není potřeba instalovat, stačí pouze zkopírovat několik souborů.

Dá se dobře využít na webhostingu, který neposkytuje velký SQL Server. K běhu databáze stačí medium-trust prostředí a mohou nad ní být ORM frameworky jako NHibernate či Entity Framework. Lze ji použít i s desktopovou aplikací, protože nevyžaduje administrátorská práva. Její engine běží v procesu aplikace.

Knihovny

K práci se SQL Server Compact 4 je potřeba stáhnout a nainstalovat Visual Studio 2010 Service Pack 1, SQL CE Tools for Visual Studio a samotný SQL CE 4 (x86 | x64). Veškeré potřebné knihovny se pak budou nacházet ve složce C:Program FilesMicrosoft SQL Server Compact Editionv4.0Pri­vate. Pro použití s ASP.NET je potřeba obsah této složky kopírovat do adresáře bin webové aplikace a přidat referenci na knihovnu System.Data.SqlSer­verCe.dll. Databázový engine pak běží v procesu aplikace.

Přehled významu jednotlivých knihoven vystihuje následující schéma a tabulka.

Modrá – nezbytné části
Fialová – volitelné části na základě přístupového modelu
Zelená – volitelné části na základě použití

Název Knihovna Poznámky
Storage Engine sqlcese40.dll
Query Processor sqlceqp40.dll
DB Utilities sqlcecompact40.dll
Managed Extensions sqlceme40.dll
ADO.NET Provider System.Data.SqlSer­verCe.dll Znám také jako ADO.NET v2 Provider
Merge Replication sqlceca40.dll Client Agent
Remote Data Access sqlceca40.dll Client Agent
sqlceer40EN.dll
LINQ/SQL Součástí .NET FW v System.Data­.Linq.dll
LINQ/Entities System.Data.SqlSer­verCe.Entity.dll Znám také jako ADO.NET v3 Provider či Entity Framework

Nonmanaged knihovny se nacházejí v podadresáři s názvem architektury procesoru, pro kterou jsou zkompilovány. System.Data.SqlSer­verCe.dll si vybere podle stroje, na kterém běží. Pokud tedy poskytovatel webhostingu přesune application pool s vaší webovou aplikací z x86 stroje na x64, web si toho ani nevšimne.

Visual Studio

Visual Studio 2010 SP1 umožňuje vytvořit novou databázi stejně snadno, jako nový soubor. Databáze by měla být umístěna v adresáři App_Data.

Po zkopírování nezbytných knihoven do adresáře bin je potřeba přidat referenci na System.Data.SqlSer­verCe.dll. Entity Framework a LINQ ještě vyžadují referenci na System.Data.SqlSer­verCe.Entity.dll.

Posledním krokem je přidání connection stringu do souboru web.config, ze kterého se přečte příkazem:

ConfigurationManager.ConnectionStrings["CeDatabase"].ConnectionString

Pokud web nasazujete pomocí nástroje Web Deploy, potřebujete verzi 2.0, kterou snadno nainstalujete přes Web Platform Installer. Database Explorer samozřejmě umožňuje vytvářet a upravovat tabulky a nově i zobrazit data v tabulce.

web.config

Pokud na serveru není nainstalován SQL Server CE 4, je potřeba do souboru web.config přidat následující:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" culture="neutral"/>
      <bindingRedirect oldVersion="4.0.0.0-4.0.0.1" newVersion="4.0.0.1"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>
<system.data>
  <DbProviderFactories>
    <remove invariant="System.Data.SqlServerCe.4.0"/>
    <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
  </DbProviderFactories>
</system.data>

Connection string pak vypadá typicky takto.

<connectionStrings>
<add name="CeDatabase" connectionString="Data Source=|DataDirectory|database.sdf" providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>

Cesta k databázi začíná makrem |DataDirectory|, které se nahradí za cestu k adresáři App_Data. Je to podobné, jako zápis cesty ~/App_Data/ obvyklý v ASP.NET.

ADO.NET

Pokud používáte starý, dobrý, výpočetně skromný, avšak vývojově časově náročný přístup k databázi, pak stačí změnit using System.Data.SqlClient na using System.Data.SqlServerCe a třídy SqlConnection a SqlCommand přepsat na SqlCeConnection respektive SqlCeCommand. O zbytek už se postará klíčové slovo  var.

string connString = ConfigurationManager.ConnectionStrings["CeDatabase"].ConnectionString;
using (var conn = new SqlCeConnection(connString)) {
    conn.Open();
    var command = new SqlCeCommand("SELECT [id] FROM [users] WHERE [age] > @age", conn);
    command.Parameters.AddWithValue("@age", age);
    using (var reader = command.ExecuteReader()) {
        while (reader.Read()) {
            id = (int)reader["id"];
        }
    }
}

Entity Framework

Code First Entity Framework je nastaven tak, aby se (pokud mu nepředáte connection string) pokusil připojit k databázi ./SQLEXPRESS. Zajímavé ale je, že pokud se connection string v souboru web.config jmenuje stejně jako třída, kterou dědíte z DbContext, použije se ten. Nové instanci třídy, která reprezentuje vaší databázi, tak nemusíte connection string předávat.

public class CeDatabase : DbContext {
    public DbSet<TableClass> MyTable { get; set; }
}
<connectionStrings>
  <add name="CeDatabase" connectionString="data source=|DataDirectory|database.sdf" providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>
using (var db = new CeDatabase()) {
    grid.DataSource = db.MyTable;
    grid.DataBind();
}

SQL

SQL Server Denali bude konečně podporovat stránkování záznamů pomocí jazyka SQL, jak to známe z MySQL pomocí klíčového slova LIMIT. Tuto funkci má SQL Server CE už nyní. Například pokud stránkujeme zákazníky po deseti, tento příkaz vrátí třetí stranu.

SELECT * FROM [Customers] ORDER BY [Customer ID] OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

Vedle podpory transakcí je dobré zmínit, co naopak Compact edice neumí. Jedná se o pohledy, triggery a tím pádem i kaskádové mazání a integritní omezení. Nejde ani vykonat více příkazů najednou oddělených středníkem.

var cmd = new SqlCommand("INSERT INTO  (url) VALUES (@url); SELECT @@Identity", conn);
cmd.Parameters.AddWithValue("@url", url);
var id = (int)cmd.ExecuteScalar();

S podporou příkazů OFFSET a FETCH pro stránkování a paralelním zpracováním příkazů se SQL Server Compact 4 stává dobře použitelným v menších webových aplikacích. Protože ho podporuje Code-First Entity Framework, lze snadno a rychle vytvořit složitější web i na webhostingu, který nemá vlastní databázi. SQL Server CE používá i vývojové prostředí WebMatrix, které obsahuje nástroj k exportu dat na jednu z vyšších edic SQL Serveru. Není třeba se bát, že s přesunem dat bude problém, až SQL Server CE přestane stačit.

Komentáře

Subscribe
Upozornit na
guest
6 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
madmucho

IIS či pro dektopové aplikace

Michal Augustýn

On kód
INSERT INTO [feed] (url) VALUES (@url); SELECT @@Identity

není moc dobrý ani na velkém SQL Serveru. Je lepší použít
INSERT INTO [feed] (url) VALUES (@url); SELECT SCOPE_IDENTITY()

nebo nejlépe
INSERT INTO [feed] (url) OUTPUT inserted.urlId VALUES (@url).

Takže otázka – podporuje OUTPUT klauzuli?

jos

drobná poznámka: OUTPUT klauzule nefunguje nad relacema s INSTEAD OF * TRIGGER

blizzboz

Ja používam SQL Server Compact u menších desktopových aplikácií ako jednoduché dátové úložisko, vtedy keď si nemôžem dovoliť spolu s aplikáciou distribuovať aj plnohodnotný SQL Server, na webe je vždy možnosť použiť plnohodnotnú DB tak nevidím dôvod prečo používať Compact verziu.

Michal Augustýn

Příště by to chtělo se prokousat aspoň k druhýmu odstavci ;-)

Dá se dobře využít na webhostingu, který neposkytuje velký SQL Server.

blizzboz

Nenapadá ma žiadny dôvod prečo by si niekto vybral hosting bez databázy a potom by naň nasadzoval, túto srandu, namiesto DB… Jedine že by ten niekto bol masochista. Neni lepšie vybrať si poriadny hosting aj z databázou?

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.