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 [ ]); } } }