9. díl - Databáze v C# .NET - SQL Server Compact Edition (CE)

C# .NET Databáze Databáze v C# .NET - SQL Server Compact Edition (CE)

Článek pojednává o technologii, jejíž vývoj byl Microsoftem ukončen. Je na devbooku pouze z historických důvodů, kdyby informace někdo potřeboval pro aplikaci, která tuto technologii ještě používá.

V několika minulých dílech jsme vytvořili jednoduchý slovníček s použitím MS-SQL databáze. Dnes si ukážeme, jak aplikaci převést do Microsoft SQL Server Compact.

SQL Server Compact (CE)

Microsoft SQL Server Compact Edition (někdy označovaný jen jako Microsoft SQL Server CE) je zjednodušená verze Microsoft SQL Serveru, která je obsažená jen v několika DLL souborech. Databáze je poté uložena jako jeden soubor na disku. Pokud k naší aplikaci přiložíme tyto soubory, bude fungovat na každém počítači, ačkoli zde Microsoft SQL server vůbec nebude nainstalovaný. Tomuto typu databáze se někdy říká embedded nebo portable. Hodí se pro běžné aplikace, které posíláme např. přátelům nebo běžným uživatelům. Pro obchodní aplikace se téměr vždy využívá klasický Microsoft SQL Server.

SQL server plně podporuje základní SQL klauzule a je také k dispozici ve verzi Express, kterou budeme používat. Oproti plné verzi nepodporuje např.:

  • DISTINCT v agregovaných funkcích
  • Uložené procedury
  • Spouště
  • Pohledy

Některé další funkce má oproti plné verzi ořezané, např. transakce nebo práce s velkými typy sloupců, jako image. Vyčerpávající porovnání SQL Serveru CE a Microsoft SQL serveru naleznete zde: http://technet.microsoft.com/…s172400.aspx

Použití SQL Serveru CE v C# .NET

Přepišme příklad pro výpis všech slovíček z minulého dílu pro SQL Server CE.

Vytvoření databáze

Nejprve si založíme novou databázi. Využijeme k tomu přímo Visual Studio. V DatabaseExploreru přidáme nové připojení.

Database explorer ve Visual Studio

Data source následně změníme na SQL Server Compact 4.0.

Microsoft SQL Server Compact Edition ve Visual Studio

Tlačítkem Create vyvoláme dialog k vytvoření nového souboru s databází. Projdeme až do složky s naší aplikací (bin/debug). Databázi pojmenujeme slovicka.sdf. Jazyk nastavíme na češtinu.

Nová SQL Server CE databáze ve Visual Studio

Vše potvrdíme a v DatabaseExploreru rozklikneme novou databázi a vytvoříme zde tabulku, kterou naplníme daty. Věřím, že to nemusím popisovat, je to podobné jako v Microsoft SQL Management Studio. Hotová tabulka je vidět na screenshotu.

Návrh databázové tabulky pro Microsoft SQL Server CE ve Visual Studio

Data do tabulky vložíme pravým klikem a zvolením Show table data:

Editace dat v databázi pomocí Visual Studio

Upravení projektu

K projektu musíme nejprve na SQL Server CE přidat referenci. Jinak nebudeme moci používat jeho jmenné prostory. Referenci přidáme v SolutionExploreru pravým kliknutím na References a poté na Add.

Přidání reference k C# .NET projektu ve Visual Studio

V dialogu zvolíme Assemblies -> Extensions a zaškrtneme checkbox u System.Data.SqlSer­verCe 4.0.0.0.

Reference na SQL Server CE ve Visual Studio

Nyní musíme upravit zdrojový kód našeho projektu. Úprava bude velmi jednoduchá, přídáme using System.Data.SqlSer­verCe a všem databázovým třídám přidáme do názvu Ce. Nesmíme zapomenout změnit ConnectionString na relativní cestu k souboru s databází.

string connectionString = @"Data Source=slovicka.sdf";
using (SqlCeConnection spojeni = new SqlCeConnection(connectionString))
{
        spojeni.Open();
        string dotaz = "SELECT * FROM Word";
        using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(dotaz, spojeni))
        using (DataSet vysledky = new DataSet())
        {
                adapter.Fill(vysledky);
                foreach (DataRow radek in vysledky.Tables[0].Rows)
                {
                        Console.WriteLine("Id: " + radek[0] + ", česky: " + radek["Czech"] + ", anglicky: " + radek["English"]);
                }
        }
        spojeni.Close();
        Console.ReadKey();
}

Projekt funguje úplně stejně jako předtím, databáze však již není jako lokálně běžící služba, ale jako jednoduchý soubor.

Microsoft SQL Server Express v C# .NET

Kopírování souborů

Aby naše aplikace fungovala, musíme k ní přibalit Microsoft SQL Server CE. Otevřeme si následující umístění

C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0

Je důležité, abyste vybrali Program Files (x86), budeme s naší aplikací distribuovat 32bitovou verzi serveru. Všechny dll soubory z této složky zkopírujeme do složky bin/Debug našeho projektu.

Dále otevřeme:

C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Desktop

A soubor System.Data.SqlSer­verCe.dll též zkopírujeme. Pokud budete chtít používat v aplikaci Entity Framework, je třeba zkopírovat ještě dll ze složky System.Data.SqlSer­verCe.Entity.

Aplikaci můžete zkusit poslat přátelům, bude jim fungovat, i když nemají nainstalovaný Microsoft SQL Server.

Závěrem

V těchto třech dílech jsme si ukázali, jak se v C# .NET pracuje s databází pomocí MS-SQL dotazů. Příště si ukážeme, jak se s DB pracuje pomocí technologie LINQ TO SQL.

Co se týče další syntaxe MS-SQL, tak v seriálu dále naleznete mnoho dotazů v příkladech, které ukazují jak se pokročilejší dotazy v MS-SQL zapisují. Určitě se na ně podívejte. Dnešní projekt je jako vždy ke stažení v příloze.


 

Stáhnout

Staženo 227x (38.61 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Předchozí článek
DataSet podruhé
Miniatura
Všechny články v sekci
Databáze v C# - ADO.NET

 

 

Komentáře
Zobrazit starší komentáře (1)

Avatar
Michal Štěpánek:

A proč potřebuješ SQLCE? Podporu pro tento DBsystém už asi budeš hledat těžko... Pohodlně lze používat Express verzi SQL (volně ke stažení) nebo přímo integrovanou ve Visual Studiu...

Odpovědět 12.4.2014 19:26
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
AndrejB
Člen
Avatar
AndrejB:

zatial sa tomuto moc nevenujem a nerozumie ale chcel som si skusit tento príklad,...uz som to vyriešil, SQLCE sa nachadza v inom priečinku, stačilo ho len nájsť.

Odpovědět 13.4.2014 10:08
Pozitívne myslenie zvyšuje kreativitu....
Avatar
Maros2470
Člen
Avatar
Maros2470:

Zkouším převést své pokusy podle tohoto tutoriálu. Mám to napsáno takto:
using System;
using System.Collec­tions.Generic;
using System.Componen­tModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Window­s.Forms;
using System.Threadin­g.Tasks;
using System.Data.SqlCli­ent;
using System.Data.SqlSer­verCe;

namespace Firma3
{
public partial class PredvolbaTelForm : Form
{
SpojeniForm telefonCislaForm;
public PredvolbaTelForm()
{
InitializeCom­ponent();

predvolbaTextBox­.Focus();

string connectionString = @"Data Source=eli.sdf";
using (SqlConnection pripojeni = new SqlConnection(con­nectionString))
{
pripojeni.Open();

SqlCommand prikaz = new SqlCommand("SELECT PredvolbyTele­fonuId, Predvolba, Zeme FROM PredvolbyTelefonu", pripojeni);

SqlDataReader dataReader = prikaz.Execute­Reader();
while (dataReader.Read())
{

predvolbyData­Grid.Rows.Add(da­taReader["Pred­volbyTelefonu­Id"].ToString(), dataReader["Pred­volba"].ToStrin­g(), dataReader["Ze­me"].ToString());

}
pripojeni.Close();
}

Na řádku: pripojeni.Open(); mi to spadne s hlášením: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server). Používám VS2010 Profi Net FW 3.5

Editováno 15.5.2014 14:50
 
Odpovědět 15.5.2014 14:49
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

1.) používej tlačítko CODE, takhle je to strašně nepřehledný

2.) ten connectionstring

string connectionString = @"Data Source=eli.sdf";

jsi vzal kde?
Ta chyba je o tom, že se nepřipojí k DB...

Editováno 15.5.2014 16:53
Odpovědět 15.5.2014 16:51
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Maros2470
Člen
Avatar
Maros2470:

Psal jsem to podle tutorialu. I když jsem vypsal celou adresu podle properties databaze, dělá to to samé. Když jsem databázi zakládal a zkoušel spojení tak spojení fungovalo

 
Odpovědět 15.5.2014 17:04
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

a v configu máš takto napsaný connectionstring?

Odpovědět 15.5.2014 18:12
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Maros2470
Člen
Avatar
Odpovídá na Michal Štěpánek
Maros2470:

Mám, ten jsem právě zkoušel taky a stejná chyba.

 
Odpovědět 15.5.2014 18:17
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

Ještě mě napadlo, jaký SQL server používáš? Hoď sem ten connectionstring z configu...

Odpovědět 16.5.2014 10:40
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Maros2470
Člen
Avatar
Odpovídá na Michal Štěpánek
Maros2470:

Když jsem to napsal takto, tak to funguje:

string connectionString = @"Data Source=Data.sdf";  // definice adresy databáze
            using (SqlCeConnection spojeni = new SqlCeConnection(connectionString))  // nové připojení
            {
                spojeni.Open();  // připojení databáze;
                string dotazPredvolby = "SELECT * FROM PredvolbyTelefonu";  // SQL příkaz
                using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(dotazPredvolby, spojeni)) // // spuštění příkazu
                using (DataSet vysledky = new DataSet())
                {
                    adapter.Fill(vysledky);  // provedení příkazu
                    foreach (DataRow radek in vysledky.Tables[0].Rows)  // vypsání hodnot z databáze
                    {
                        predvolbyDataGrid.Rows.Add(radek["PredvolbyId"], radek["Predvolby"], radek["Zeme"]);  // ddataGrig vypíše hodnoty
                    }
                }
                spojeni.Close();  // odpojení databáze

            }
Editováno 16.5.2014 20:10
 
Odpovědět 16.5.2014 20:09
Avatar
homer
Člen
Avatar
homer:

Ako bude fungovat sposob zabezpecenia komunikacie medzi aplikaciou v C# a databazou v SQL Server CE? Dakujem za kazdu odpoved!

 
Odpovědět 29.5.2015 15:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 11. Zobrazit vše