reklama

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.

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...
reklama
Určitě si přečtěte

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

** V Brně byl velký výpadek služeb UPC ** Důvodem je překopnutý páteřní kabel ** V některých lokalitách služby stále nefungují

5.  12.  2016 | Jakub Čížek | 100

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

** Zmizí klasické vyhledávače ** Budeme programovat buňky ** Kvantové počítače překonají šifry

6.  12.  2016 | Jakub Čížek | 35

ASUS ZenBook 3 se začal prodávat v Česku. Je ve všem lepší než MacBook, ale bude to stačit?

ASUS ZenBook 3 se začal prodávat v Česku. Je ve všem lepší než MacBook, ale bude to stačit?

** Novinka od Asusu míří přímo proti MacBooku od Applu ** Nabídne daleko více výkonu za stejné peníze

2.  12.  2016 | David Polesný | 146

11 tipů na dobrý stolní počítač: od základu po herní mašiny

11 tipů na dobrý stolní počítač: od základu po herní mašiny

** Postavte si stolní počítač! Máme pro vás 11 vzorových sestav s rozpisem komponent ** Většina tipů cílí na hráče, věnujeme se ale i základnímu PC a počítačům na střih videa ** Nadělte si nový počítač třeba pod stromeček

5.  12.  2016 | Adam Kahánek | 73


reklama