Dajbych.net


SQL Server Compact 4

, 6 minut čtení

Mi­crosoft min­ulý tý­den vy­dal novou verzi své em­bed­ded databáze. Předešlé verze této databáze se použí­valy jen s desk­topovými ap­likacemi. Nebyla vytvořena tak, aby mohla ob­s­luho­vat více poža­davků 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ů­sob­nosti výrazně rozšířilo o nasazení na we­bových serverech. Databázi není potřeba in­stalo­vat, stačí pouze zkopírovat něko­lik souborů.

Dá se dobře využít na web­hostingu, který neposky­tuje velký SQL Server. K běhu databáze stačí medium-trust prostředí a mohou nad ní být ORM frame­worky jako NHiber­nate či En­tity Frame­work. Lze ji použít i s desk­topovou ap­likací, protože nevyžaduje ad­min­istrá­torská práva. Její en­gine běží v pro­cesu ap­likace.

Knihovny

.NET

Přeh­led výz­namu jed­notlivých kni­hoven vys­ti­huje násle­du­jící schéma a tab­ulka.

[Normlnweb] Modrá – nezbytné části

[Normlnweb] Fialová – volitelné části na základě přístupového modelu

[Normlnweb] Zelená – volitelné části na základě použití

NázevKni­hovnaPoznámky
Stor­age En­ginesql­cese40.dll
Query Pro­ces­sorsql­ceqp40.dll
DB Util­i­tiessql­ce­com­pact40.dll
Man­aged Ex­ten­sionssql­ceme35.dll
ADO.NET ProviderSys­tem.Data.SqlServerCe.dllZnám také jako ADO.NET v2 Provider
Merge Repli­ca­tionsql­ceca40.dllClient Agent
Re­mote Data Ac­cesssql­ceca40.dllClient Agent
sql­ceer40EN.dll
LINQ/SQLSoučástí .NET FW v Sys­tem.Data.Linq.dll
LINQ/En­ti­tiesSys­tem.Data.SqlServerCe.En­tity.dllZnám také jako ADO.NET v3 Provider či En­tity Frame­work

Non­man­aged kni­hovny se nacházejí v po­dadresáři s názvem ar­chitek­tury pro­ce­soru, pro kterou jsou zkom­pilovány. Sys­tem.Data.SqlServerCe.dll si vy­bere po­dle stroje, na kterém běží. Pokud tedy posky­to­va­tel web­hostingu pře­sune ap­pli­ca­tion pool s vaší we­bovou ap­likací z x86 stroje na x64, web si toho ani nevšimne.

Visual Studio

Vi­sual Stu­dio 2010 SP1 umožňuje vytvořit novou databázi ste­jně snadno, jako nový sou­bor. Databáze by měla být umístěna v adresáři App_Data.

.NET

Po zkopírování nezbyt­ných kni­hoven do adresáře bin je potřeba při­dat ref­erenci na Sys­tem.Data.SqlServerCe.dll. En­tity Frame­work a LINQ ještě vyžadují ref­erenci na Sys­tem.Data.SqlServerCe.En­tity.dll.

.NET

Posled­ním krokem je přidání con­nec­tion stringu do souboru web.con­fig, ze kterého se přečte příkazem:

Con­fig­u­ra­tion­Man­ager.Con­nec­tion­Strings["CeDatabase"].Con­nec­tion­String

Pokud web nasazu­jete po­mocí nástroje Web De­ploy, potře­bu­jete verzi 2.0, kterou snadno nain­stalu­jete přes Web Plat­form In­staller. Database Ex­plorer samozře­jmě umožňuje vytvářet a upravo­vat tab­ulky a nově i zo­brazit data v tab­ulce.

web.config

Pokud na serveru není nain­stalován SQL Server CE 4, je potřeba do souboru web.con­fig při­dat násle­du­jící:

  <run­time>
    <as­sem­bly­Bind­ing xmlns="urn:sche­mas-mi­crosoft-com:asm.v1">
      <de­pen­den­tAssem­bly>
        <as­sem­blyI­den­tity name="Sys­tem.Data.SqlServerCe" publicKey­To­ken="89845dcd8080cc91" cul­ture="neu­tral"/>
        <bind­in­gRedi­rect old­Ver­sion="4.0.0.0-4.0.0.1" newVer­sion="4.0.0.1"/>
      </de­pen­den­tAssem­bly>
    </as­sem­bly­Bind­ing>
  </run­time>
  <sys­tem.data>
    <DbProvider­Fac­to­ries>
      <re­move in­vari­ant="Sys­tem.Data.SqlServerCe.4.0"/>
      <add name="Mi­crosoft SQL Server Com­pact Data Provider 4.0" in­vari­ant="Sys­tem.Data.SqlServerCe.4.0" de­scrip­tion=".NET Frame­work Data Provider for Mi­crosoft SQL Server Com­pact" type="Sys­tem.Data.SqlServerCe.Sql­Ce­Provider­Fac­tory, Sys­tem.Data.SqlServerCe, Ver­sion=4.0.0.1, Cul­ture=neu­tral, PublicKey­To­ken=89845dcd8080cc91"/>
    </DbProvider­Fac­to­ries>
  </sys­tem.data>

Con­nec­tion string pak vy­padá typ­icky takto.

  <con­nec­tion­Strings>
    <add name="Ce­Database" con­nec­tion­String="Data Source=|DataDi­rec­tory|database.sdf" provider­Name="Sys­tem.Data.SqlServerCe.4.0"/>
  </con­nec­tion­Strings>

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

ADO.NET

Pokud používáte starý, do­brý, výpočetně skromný, avšak vývo­jově časově náročný přístup k databázi, pak stačí změnit us­ing Sys­tem.Data.Sql­Client na us­ing Sys­tem.Data.SqlServerCe a třídy Sql­Con­nec­tion a Sql­Com­mand přep­sat na Sql­Ce­Con­nec­tion re­spek­tive Sql­CeCom­mand. O zbytek už se postará klíčové slovo var.

string conn­String = Con­fig­u­ra­tion­Man­ager.Con­nec­tion­Strings["CeDatabase"].Con­nec­tion­String;
us­ing (var conn = new SqlCeCon­nec­tion(conn­String)) {    conn.Open();    var com­mand = new SqlCeCom­mand("SE­LECT [id] FROM [users] WHERE [age] > @age", conn);    com­mand.Pa­ram­e­ters.Ad­d­With­Value("@age", age);    us­ing (var reader = com­mand.Ex­e­cuteReader()) {        while (reader.Read()) {            id = (int)reader["id"];        }    }}

Entity Framework

Code First En­tity Frame­work je nas­taven tak, aby se (pokud mu nepředáte con­nec­tion string) pokusil připo­jit k databázi ./SQL­EX­PRESS. Za­jí­mavé ale je, že pokud se con­nec­tion string v souboru web.con­fig jmenuje ste­jně, jako třída kterou dědíte z Db­Con­text, použije se ten. Nové in­s­tanci třídy, která reprezen­tuje vaší databázi, tak ne­musíte con­nec­tion string předá­vat.

[FormtovanvHTML] public class CeDatabase : DbContext {     public DbSet<TableClass> MyTable { get; set; } }

<con­nec­tion­Strings>
  <add name="Ce­Database" con­nec­tion­String="data source=|DataDi­rec­tory|database.sdf" provider­Name="Sys­tem.Data.SqlServerCe.4.0"/>
</con­nec­tion­Strings>

us­ing (var db = new CeDatabase()) {    grid.Data­Source = db.MyTa­ble;    grid.DataBind();}

SQL

SQL Server De­nali bude konečně pod­porovat stránkování záz­namů po­mocí jazyka SQL, jak to známe z MySQL po­mocí klíčového slova LIMIT. Tuto funkci má SQL Server CE už nyní. Napřík­lad pokud stránku­jeme zákazníky po de­seti, tento příkaz vrátí třetí stranu.

SE­LECT * FROM Cus­tomers OR­DER BY [Cus­tomer ID] OFF­SET 20 ROWS FETCH NEXT 10 ROWS ONLY;

Ve­dle pod­pory transakcí je do­bré zmínit, co naopak Com­pact edice neumí. Jedná se o poh­ledy, trig­gery a tím pá­dem i kaská­dové mazání a in­tegritní omezení. Ne­jde ani vykonat více příkazů na­jed­nou od­dělených střed­níkem.

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

S pod­porou příkazů OFF­SET a FETCH pro stránkování a par­alel­ním zpra­cováním příkazů se SQL Server Com­pact 4 stává dobře použitel­ným v menších we­bových ap­likacích. Pro­tože ho pod­poruje Code-First En­tity Frame­work, lze snadno a rychle vytvořit složitější web i na web­hostingu, který nemá vlastní databázi. SQL Server CE používá i vývo­jové prostředí Web­Ma­trix, které ob­sahuje nástroj k ex­portu dat na jednu z vyšších edic SQL Serveru. Není třeba se bát, že s pře­sunem dat bude prob­lém, až SQL Server CE přes­tane stačit.

Článek byl sep­sán pro Zdro­ják.