Poznáváme C# a Microsoft .NET 55. díl – ADO .NET – IDataReader a připojené aplikace

Po úvodu do komponenty ADO .NET se dnes již podíváme na to, jakým způsobem je možné číst data z datového zdroje pomocí implementací rozhraní IDataReader.
Poznáváme C# a Microsoft .NET 55. díl – ADO .NET – IDataReader a připojené aplikace

Připojené aplikace a ADO .NET

Po minulém díle již víme, co se skrývá za pojmem připojená a odpojená aplikace. V dnešním díle se podíváme na role jednotlivých rozhranní ve světě ADO .NET a to předně pro realizaci přístupu k datovému zdroji v případě implementace připojené aplikace. Implementace přístupu k datovému zdroji v případě připojené aplikace ukazuje následující obrázek, který jste mohli vidět již v minulém díle a nyní nastal čas, abychom se na něj podívali detailněji.

Klepněte pro větší obrázek

K tomu, abychom k našemu datovému zdroji mohli přistupovat z aplikace, potřebujeme aby bylo vytvořeno aktivní spojení, které je v ADO .NET představováno implementacemi rozhraní IDbConnection konkrétním ADO .NET data providerem (SqlConnection, OracleConnection…)

Po vytvoření tohoto spojení k datovému zdroji jsme již schopní nad tímto spojením provádět operace, které jsou představovány implementacemi rozhraní IDbCommand (SqlCommand, OracleCommand …) a v případě potřeby je možné tomuto příkazu předat nějaké parametry v podobě implementací rozhraní IDataParameter (SqlParameter, OracleParameter …).

V připojených aplikacích jsou data, která jsou vrácena po vykonání určitého příkazu čtena pomocí implementace rozhraní IDataReader (SqlDataReader, OracleDataReader...), který čte datový proud představující výsledkovou sadu. S rozhraním IDataReader souvisí také rozhraní IDataRecord (IDataReader toto rozhraní rozšiřuje), jehož implementace představuje jednotlivý datový záznam (řádek ve výsledkové sadě) a pomocí něj jsme schopni přistupovat k jednotlivým hodnotám ve sloupcích.

Volba datového zdroje a ADO .NET data provideru

Až budete implementovat aplikaci pracující s daty, tak si samozřejmě budete muset zvolit, kde tato data budou uchovávána, tedy co bude vaším datovým zdrojem. Nejčastěji to bude otázka „Jaký konkrétní relační databázový systém ?„. S odpovědí na tuto otázku samozřejmě souvisí i volba konkrétního ADO .NET data provideru a tím pádem také konkrétních implementací ADO .NET rozhraní (IDbConnection, IDbCommand...).

Závisí jen na vás, jestli budete ve svém kódu používat přímo vytváření konkrétních instancí implementátorů zmíněných rozhraní, nebo jestli použijete nějaký sofistikovanější přístup pro vytváření těchto instancí a k nim přistupovat přes referenční proměnné typu rozhraní, čímž dosáhnete nezávislosti vašeho programového kódu na konkrétním datovém zdroji.

Já ve svých příkladech, kromě výjimečných případů, budu jako datový zdroj používat Microsoft SQL server 2000 a z důvodu jednoduchosti příkladu budu psát kód vázaný na související ADO .NET data provider (přímé vytváření instancí konkrétních tříd). V příkladech tedy budou používány typy ze jmenného prostoru System.Data.SqlClient (SqlConnection, SqlCommand...).

Pokud se rozhodnete používat jiný datový zdroj, tak samozřejmě zvolíte jiný ADO .NET data provider s čímž souvisí i použití adekvátních typů. Takže pokud se například rozhodnete používat jako datový zdroj databázi MS Access použijete typy ze jmenného prostoru System.Data.OleDb (ADO .NET data provider pro OLEDB) nebo System.Data.Odbc (ADO .NET data provider pro ODBC).

Poznámka: V příkladech se nebudu zaobírat problematikou jazyka SQL ani problematikou jednotlivých databázových systémů, protože je to nad rámec tohoto seriálu a budu předpokládat, že čtenáři mají alespoň základní zkušenosti s touto problematikou.

Implementace čtení dat pomocí rozhraní IDataReader

Pro své úvodní příklady budu používat jednoduchou tabulku employee, která uchovává údaje o zaměstnanci (velmi častý příklad) s pouze čtyřmi sloupci - ID, FirstName, SurName, BirthDate. V příkladech ke článku naleznete generační skript pro MS SQL server a (výjimečně) soubor databáze Access.

Nyní když už víme jaký je obecný přístup k realizaci přístupu k datovému zdroji v případě připojených aplikací, přejdeme ke konkrétním zdrojovým kódům. Následující zdrojový kód ukazuje realizaci pro MS SQL server.

public class SqlDataReaderExample
{
  internal static void Run()
  {
    //connection string
    string conStr = @"data source=`dellak\sql1`;initial catalog=`zive`;integrated security=sspi";
    //vytvoreni spojeni k datovemu zdroji na zaklade con. stringu
    SqlConnection conn = new SqlConnection(conStr);
    //vytvoreni sql prikazu
    SqlCommand comm = new SqlCommand("select * from employee", conn);
    SqlDataReader reader = null;
    try
    {
      //otevreni spojeni
      conn.Open();
      //vykonani sql prikazu s vytvoreni readeru
      reader = comm.ExecuteReader();
      //dokud jsou data ke cteni
      while (reader.Read())
      {
        //vypis obsahu pro jednotlive slozky (sloupce) aktualniho radku
        for (int i = 0; i < reader.FieldCount; i++)
        {
          if (i < (reader.FieldCount - 1) )
          {
            Console.Write(String.Format("{0} - ",  reader[i]) );
          }
          else
          {
            Console.Write(reader[i]);
          }
        }
        Console.WriteLine();
      }
    }
    catch(SqlException ex)
    {
      Console.WriteLine("Doslo k vyjimce : {0}", ex);
    }
    finally
    {
      //uzavreni readeru
      if (reader != null) reader.Close();
      //uzavreni spojeni
      if (conn != null) conn.Close();
    }
  }
}

Jak vidíte, není na tomto přístupu nic složitého. Jako první krok je v tomto příkladu vytvořena instance třídy SqlConnection, což je tedy implementace rozhraní IDbConnection ADO .NET data providerem pro MS SQL server. Poté je vytvořen příkaz SqlCommand, který reprezentuje SQL příkaz předaný konstruktoru (možné je také využít vlastnost CommandText) a je asociován s vytvořenou instancí třídy SqlConnection (parametr konstruktoru nebo instanční vlastnost Connection).

Připojení k databázi učiníme aktivním zavoláním metody Open na instanci třídy SqlConnection. Po aktivaci (otevření) spojení, pomocí zavolání metody ExecuteReader na instanci třídy SqlCommand zapříčiníme vykonání SQL dotazu a nad jeho výsledkovou sadou spustíme implementaci rozhraní IDataReader, což je v našem případě SqlDataReader.

Pomocí metody Read instance této třídy zajistíme, že se pozice data readeru posune na další řádek výsledkové sady, pokud takový existuje. Data jsou během čtení vypisována použitím indexeru, který je implementací vlastnosti Item rozhraní IDataRecord pro jazyk C#. Tento indexer vrací hodnotu konkrétního sloupce, který je specifikován pořadovým číslem sloupce (použito v příkladu) nebo přímo jeho jménem sloupce (přetížený indexer), pro právě čtený záznam (řádek výsledkové sady). Ve výpisu hodnot je pro zjištění toho, jestli se jedná o čtení hodnoty posledního sloupce použita vlastnost FieldCount, která vrací počet sloupců výsledkové sady.

Pro demonstraci, na konec předkládám kód, který pracuje s databází MS Access:

public class OleDbDataReaderExample
{
  internal static void Run()
  {
    string conStr = @String.Format("provider=`Microsoft.JET.OLEDB.4.0`;data source=`{0}`", AppDomain.CurrentDomain.BaseDirectory + @"db\zive.mdb");
    OleDbConnection conn = new OleDbConnection(conStr);
    OleDbCommand comm = new OleDbCommand("select * from employee", conn);
    OleDbDataReader reader = null;
    try
    {
      conn.Open();
      reader = comm.ExecuteReader();
      while (reader.Read())
      {
        for (int i = 0; i < reader.FieldCount; i++)
        {
          if (i < (reader.FieldCount - 1) )
          {
            Console.Write(String.Format("{0} - ",  reader[i]) );
          }
          else
          {
            Console.Write(reader[i]);
          }
        }
        Console.WriteLine();
      }
    }
    catch(OleDbException ex)
    {
      Console.WriteLine("Doslo k vyjimce : {0}", ex);
    }
    finally
    {
      if (reader != null) reader.Close();
      if (conn != null) conn.Close();
    }
  }
}

Sami vidíte, že jediná podstatná změna se týká connection stringu. Zbylý postup zůstal stejný, pouze jsou použity jiné implementace rozhraní ADO .NET. Znovu opakuji, že je možné využitím rozhraní ADO .NET spolu s využitím vhodných postupů (například objektové továrny (Factory) ) psát takový kód, který je zcela nezávislý na použitém datovém zdroji.

Příklady ke článku jsou k dispozici zde.

Příští díl se budeme dále zabírat implementací přístupu k datovému zdroji v připojené aplikaci.

Témata článku: Software, Microsoft, Programování, Catch

1 komentář

Nejnovější komentáře

  • Pavel Polívka 24. 11. 2007 13:48:50
    Programovou oflline verzi seriálu naleznete ke stažení na...
Určitě si přečtěte

Pojďme programovat elektroniku: Postavíme si titěrnou Wi-Fi meteostanici s lepším teploměrem než Netatmo

Pojďme programovat elektroniku: Postavíme si titěrnou Wi-Fi meteostanici s lepším teploměrem než Netatmo

** Dnes se podíváme na maličkou Wi-Fi destičku Wemos D1 mini ** A připojíme k ní barometrický a teplotní shield ** Poběží na ní web a nabídne i JSON API

18.  6.  2017 | Jakub Čížek | 28

Jak vybrat monitor k počítači: nenechte se zlákat nepodstatnými parametry

Jak vybrat monitor k počítači: nenechte se zlákat nepodstatnými parametry

** Na jaké parametry se zaměřit a kde vás výrobci chtějí nachytat ** Monitory se stále více specifikují pro konkrétní určení ** Náročný hráč nebo profesionální grafik mají různé požadavky

20.  6.  2017 | Tomáš Holčík | 31

Dlouhodobý test HTC Vive: co vám recenze o virtuální realitě neřeknou

Dlouhodobý test HTC Vive: co vám recenze o virtuální realitě neřeknou

** Ani hry se sebelepší grafikou vás nevtáhnou tolik, jako ve virtuální realitě ** Pro sledování filmů není VR ani zdaleka ideální ** I první generace je skvělá, stále však působí jako prototyp

20.  6.  2017 | Stanislav Janů | 22

Jak unikají informace o nových iPhonech? Třeba podprsenkami čínských pracovnic

Jak unikají informace o nových iPhonech? Třeba podprsenkami čínských pracovnic

** Na černém trhu mohou zaměstnanci továren za kradené součástky inkasovat částku ve výši ročního platu ** Velké množství informací je vyneseno i z centrály Applu ** Díly jsou pašovány v botách, podprsenkách i odpadem

21.  6.  2017 | Stanislav Janů | 22


Aktuální číslo časopisu Computer

Bojujeme proti Fake News

Dva velké testy: fotoaparáty a NASy

Co musíte vědět o změně evropského roamingu

Radíme s výběrem základní desky