niedziela, 20 stycznia 2013

70-516 Pobieranie i zapis danych do bazy - DbCommand, DbDataAdapter, MARS, UDT

Wykonywanie poleceń na bazie danych najlepiej przeprowadzić przy użyciu klasy DbCommand. Klasa ta do swojego działania wymaga otwartego połączenia. Do połączenia można dodać parametry z wartościami. W zależności od providera parametry mogą wymagać poprawnych nazw.
DbCommand posiada następujące metody:
  • ExecuteNonQuery - wywołanie metody, która nie zwraca rezultatu - jedyną odpowiedzią jako otrzymamy w tym przypadku od serwera bazy danych to ilość zmienionych rekordów
  • ExecuteReader - zwraca klasę umożliwiającą odczyt danych w jedną stronę. Obiekt który zostanie zwrócony po wywołaniu tej metody to DbDataReader. Klasa ta posiada metodę Read, która zwraca czy są jeszcze dane do odczytania. Jeżeli nie otrzymamy wartość null.
  • ExecuteScalar - pozwala na odebranie pojedynczej wartości 

MARS - Multiple Active Result Sets
Ustawienie tej metody do połączenia z bazą danych umożliwia uruchamianie wielu DbDataReader-ów jednocześnie. Jeżeli nie włączymy tej technologi, na raz na serwerze będzie mógł działać tylko jeden DbDataReader na raz. Aby włączyć tę technologię należy do connection string dodać: MultipleActiveResultSets=True
Bez MARS można sobie poradzić tworząc większą ilość połączeń. Ta technologia w zamierzeniu ma ułatwić programiście tworzenie wielu zapytań do bazy danych, wykonywanych w tym samym czasie.


DbDataAdapter
Obiekt ten służy do pobierania i uaktualnia danych pomiędzy bazą a obiektem DataTable. DbDataAdapter posiada właściwości umożliwiające pobieranie, usuwanie, uaktualnianie i usuwanie danych z bazy:
  • SelectCommand
  • InsertCommand
  • UpdateCommand
  • DeleteCommand
DataAdapter sam zarządza połączeniem - otwiera i zamyka je automatycznie. Za pomocą metody Fill pozwala załadować dane do obiektów DataTable, DataSet. Chcąc korzystać z tych poleceń należy je uzupełnić albo ręcznie albo za pomocą obiektu DbCommandBuilder.
Aby zwiększyć wydajność zapisu danych do bazy danych, można ustawić właściwość UpdateBatchSize. Domyślnie wysyłany jest na raz jeden rekord do bazy. Zwiększając tę wartość, na raz zostanie wysłana większa ilość rekordów.


UDTs
Począwszy od MS SQL 2005 jest możliwość używania .NET w środowisku MS SQL. Dzięki temu, możemy napisać kod w C# który zostanie uruchomiony na serwerze. Dzięki wsparciu dla SQLCLR użytkownik może tworzyć własne typy i struktury danych, które zostaną przechowane na serwerze.
Należy pamiętać, że po stronie zarówno klienta, jak i serwera muszą być te same biblioteki DLL zawierające informacje o typach.
Przykładowo stworzymy program, który może przechowywać dane geograficzne (położenie):
Definicja tabeli w bazie danych:

CREATE TABLE Locations(ZipCode CHAR(5),Location Geography);

Następnie w projekcie dodajemy referencję do biblioteki Microsoft.SqlServer.Types. Na mojej maszynie biblioteka ta znajduje się pod ścieżką C:\Program Files (x86)\Microsoft SQL Server\110\SDK\Assemblies

Kod w C# pozwalający na dodanie informacji o położeniu:

Code:
            using (var connection = new SqlConnection(db2ConnectionString))
            {
                var command = connection.CreateCommand();
                command.CommandText = "INSERT INTO Locations VALUES(@zip, @loc)";
                var zip = new SqlParameter("@zip", "34120");
                var loc = new SqlParameter("@loc", SqlDbType.Udt);
                loc.UdtTypeName = "geography";
                loc.Value = SqlGeography.STGeomFromText(new SqlChars("POINT(41.44 78.21)"), 4326);
                command.Parameters.AddRange(new[] {zip, loc});
                connection.Open();
                command.ExecuteNonQuery();
            }

Brak komentarzy:

Prześlij komentarz