Czytnik danych

W ADO.NET DataReader to szeroka kategoria obiektów używanych do sekwencyjnego odczytu danych ze źródła danych . Czytniki danych zapewniają bardzo wydajny sposób uzyskiwania dostępu do danych i można je traktować jak kursor Firehose z ASP Classic , z tą różnicą, że nie jest używany żaden kursor po stronie serwera . DataReader analizuje strumień danych tabelarycznych z Microsoft SQL Server i inne metody pobierania danych z innych źródeł.

Obiektowi DataReader zwykle towarzyszy obiekt Command, który zawiera zapytanie, opcjonalnie dowolne parametry oraz obiekt połączenia, na którym ma zostać uruchomione zapytanie.

Typy czytników danych

ADO.NET nie ma klasy DataReader , ale istnieje wiele klas, które implementują interfejs IDataReader:

  • System.Data.SqlClient.SqlDataReader
  • System.Data.OleDb.OleDbDataReader
  • Oracle.OracleClient.OracleDataReader

DataReaders mają niewielkie rozmiary i dobrą wydajność, ponieważ każdy jest dostosowany do danego zadania, jednak utrudnia to napisanie aplikacji, którą można przenosić z jednego źródła danych zaplecza do innego. Niektóre DataReaders specyficzne dla dostawcy uwidaczniają typy używane przez bazową bazę danych — na przykład int mogą mieć wartość null w programie Microsoft SQL Server, ale nie w .NET Framework przed wersją 2,0.

Silne kontra słabe pisanie

Używając DataReadera do pobierania danych, programista może wybrać odczytywanie wartości pól w sposób silnie wpisany ( przykład: myReader.GetString(12) ) lub w sposób słabo wpisany, zwracając następnie jako System.Object s ( przykład: myReader.GetValue( 12) ). Oba podejścia mają swoje wady i zalety.

Korzystanie z silnie wpisanych metod wyszukiwania może być bardziej uciążliwe, zwłaszcza bez szczegółowej wiedzy na temat danych źródłowych. Wartości liczbowe w bazie danych można przetłumaczyć na kilka typów .NET : Int16 , Int32 , Int64 , Float, Decimal lub Currency . Próba pobrania wartości przy użyciu niewłaściwego typu powoduje zgłoszenie wyjątku, który zatrzymuje dalsze działanie kodu i spowalnia aplikację. Dzieje się tak również wtedy, gdy używasz właściwego typu, ale napotkasz DbNull ( można tego uniknąć, używając funkcji logicznej IsDbNull klasy DataReader ). Zaletą tej metody wyszukiwania jest to, że walidacja danych jest przeprowadzana wcześniej, co zwiększa prawdopodobieństwo możliwości korekty danych.

Pobieranie danych o słabym typie umożliwia szybkie pisanie kodu i umożliwia wykorzystanie danych w pewien sposób, gdy programista nie wie wcześniej, jakie typy zostaną zwrócone. Ponadto przy pewnym wysiłku programista może wyodrębnić wartość do zmiennej odpowiedniego typu, używając GetFieldType lub GetDataTypeName obiektu DataReader.

Powszechne błędy

DataReader może w niektórych przypadkach być używany zamiast DataTable, jednak wielu programistów doświadczyło rozdęcia połączenia podczas stosowania tego podejścia. DataReader może być używany tylko w przypadku (już) otwartego połączenia z bazą danych ; to połączenie nie zostanie zamknięte, dopóki nie zostanie wywołana metoda Dispose DataReadera . Jeśli wyjątek zostanie zgłoszony podczas przetwarzania danych, na przykład zgodnie z opisem w sekcji Silne i słabe typowanie powyżej, metoda Dispose nigdy nie zostanie wywołana, jeśli programista napisze kod jawnie deklarujący i usuwający obiekt DataReader bez użycia try ostatecznie blok. Konstrukcja C# using to dobry sposób na uniknięcie tego problemu, jak pokazano poniżej w przykładzie kodu.

Przykładowy kod

Przykład dostępu do danych SQL przy użyciu DataReadera

 

         
    
        
             
            
        
               
                 
                    0    0

        
        
    
 void  DataTest  ()  {  using  (  SqlConnection  conn1  =  new  SqlConnection  (...))  {  conn1  .  Otwórz  ();  SqlCommand  mycommand  =  new  SqlCommand  (  "select * from someTable"  ,  conn1  );  using  (  SqlDataReader  myreader  =  mycommand  .  ExecuteReader  ())  {  if  (  myreader  ! =  null  )  while  (  myreader  .  Read  ())  Console  .  WriteLine  (  myreader  .  GetValue  (  ).  ToString  ()  +  ":"  +  myreader  .  GetTypeName  (  ));  }  moje polecenie  .  Wyrzuć  ();  }  } 
 
 
 
 
 
 

 

 

       
    
           
            
      
             
        
        
           
         
        
            0
        
    
 przy użyciu  Systemu  ;  przy użyciu  System.Collections.Generic  ;  przy użyciu  System.Linq  ;  używając  System.Text  ;  przy użyciu  System.Data.Odbc  ;  przy użyciu  MySql.Data.MySqlClient  ;  przestrzeń nazw  ConsoleAplikacja1  ;  class  Program  {  static  void  Main  (  string  []  args  )  {  string  Conn  =  "Server=localhost;Uid=root;Pwd=thiru;Database=Pracownik"  ;  MySql  .  Dane  .  MySqlClient  .  MySqlConnection  conn  =  nowy  MySql  .  Dane  .  MySqlClient  .  MySqlConnection  (  połączenie  );  MySqlCommand  comm  =  new  MySqlCommand  (  "select * from emp"  ,  conn  );  połączenie  _  Otwórz  ();  // IAsyncResult a;  MySqlDataReader  Ada  =  comm  .  ExecuteReader  ();  while  (  Ada  .  Odczyt  ())  {  Konsola  .  WriteLine  (  Ada  [  ]);  }  }  }