SQL z palmtopa


Po zdefiniowaniu wartości tzw. connection string do lokalnego pliku bazy danych:

String CS = "data source=\\BazaLocal.sdf";

Możemy zainicjować (np. w konstruktorze klasy) lokalny silnik bazodanowy:

SQLENG = newSqlCeEngine(CS);

Następnie dodajemy do formularza komponenty Button oraz ListBox. Przycisk będzie uruchamiał kod, który nawiąże połączenie z lokalną bazą danych, odczyta z niej kilka rekordów i doda je do okna ListBox. W kodzie metody MyButton_Click wpisujemy najpierw kod tworzący i otwierający nowe połączenie:

SQLCONN = new SqlCeConnection(CS);

SQLCONN.Open();

oraz przygotowujemy zapytanie SQL:

SQLCMD = new SqlCeCommand();

SQLCMD.Connection = SQLCONN;

SQLCMD.CommandText = "SELECT Imie FROM Klient";

SQL z palmtopa

Podajemy nazwę udziału, poprzez który będą wymieniane dane.

Jak widać na listingu, powyższy przykład zakłada istnienie przykładowej tabeli Klient z polem Imie. Ponieważ zapytanie to zwraca wynik w postaci rekordów, musimy wykorzystać obiekt DataReader do ich odczytania.

SQLDR = SQLCMD.ExecuteReader();

Następnie iteracyjnie odczytujemy rekordy dopóty, dopóki pojawiają się na wyjściu obiektu DataReader. Odczytane rekordy (pola z imionami) dodajemy do okna ListBox w formularzu.

while (SQLDR.Read())

MyListBox.Items.Add(SQLDR.GetString(0));

Na koniec zamykamy połączenie:

SQLCONN.Close();

SQL z palmtopa

Dane opublikowane na serwerze SQL 2000 mogą być edytowane zarówno na samym serwerze, jak i na klientach - komputerach Pocket PC.

W wypadku zapytań, które nie zwracają rekordów, czyli np. poleceń INSERT, zamiast wykorzystywać DataReader, możemy użyć innej metody obiektu SQLCMD, a mianowicie ExecuteNonQuery:

SQLENG = new SqlCeEngine(CS);

SQLCONN = new SqlCeConnection(CS);

SQLCONN.Open();

SQLCMD = new SqlCeCommand();

SQLCMD.Connection = SQLCONN;

SQLCMD.CommandText = "INSERT INTO Klient (Imie) VALUES ('"+ImieTB.Text+"')";

SQLCMD.ExecuteNonQuery();

SQLCONN.Close();

Natomiast identyfikator ostatnio dodanego rekordu można odczytać np. za pomocą obiektu DataReader:

SQLCMD.CommandText = "SELECT MAX(KlientID) FROM Klient";

SQLDR = SQLCMD.ExecuteReader();

int NewID = SQLDR.GetInt32(0);

Merge Replication

Dostęp do zdalnej bazy realizowany przez mechanizm Merge Replication polega w skrócie na tym, że pracujemy z lokalną kopią fragmentu zdalnej bazy danych i co jakiś czas synchronizujemy zawartość kopii lokalnej z bazą na serwerze. Na czas synchronizacji musimy podłączyć się do sieci. Ponieważ synchronizacja działa w obie strony, zarówno kopia lokalna, jak i baza danych mogą zostać zaktualizowane. Aby zapobiec pojawieniu się konfliktów wynikających np. z modyfikacji tych samych rekordów, SQL Server CE rozszerza tabele o dodatkowe pola, zawierające unikatowe identyfikatory każdego wiersza.

SQL z palmtopa

Uaktywniamy dostęp z poziomu komputerów Pocket PC.

Natomiast, aby zapobiec konfliktom wynikającym z dodawania nowych rekordów, można zdefiniować pule numerów klucza głównego danej tabeli oddzielnie dla każdego urządzenia mobilnego, jak również dla samego serwera. Aby móc korzystać z lokalnej kopii danych odczytanych z serwera za pomocą mechanizmu Merge Replication, musimy na komputerze Pocket PC rozpocząć subskrypcję publikacji znajdującej się na serwerze - w naszym wypadku jest to publikacja BazaPub - oraz przynajmniej raz wykonać synchronizację danych. Dalsze operacje na danych wyglądają tak samo, jak w wypadku dostępu do lokalnych danych przechowywanych w bazie SQL Server CE. Trzeba też pamiętać, aby po wprowadzeniu zmian wykonać kolejną synchronizację w celu zaktualizowania danych na serwerze.

Aby rozpocząć subskrypcję, musimy najpierw utworzyć obiekt SqlCeReplication, a następnie podać adres serwera i dane publikacji:

SqlCeReplication repl = new SqlCeReplication();

repl.InternetUrl = "http://192.168.0.201/sqlmr/sscesa20.dll";

Następnie ustawiamy dostęp anonimowy i wybieramy kontrolę dostępu Windows Integrated Authentication:

repl.InternetLogin = "";

repl.InternetPassword = "";

repl.PublisherLogin = "guest";

repl.PublisherPassword = "";

repl.PublisherSecurityMode =

SecurityType.NTAuthentication;

Wpisujemy też nazwy identyfikujące serwer, bazę danych, publikację i subskrybenta:

repl.Publisher = "ALFA";

repl.PublisherDatabase = "Baza";

repl.Publication = "BazaPub";

repl.Subscriber = "BazaSub";

Natomiast connection string, który określa lokalny plik bazy danych przechowujący kopię informacji pobranych z serwera, będzie następujący:

repl.SubscriberConnectionString = "Provider=Microsoft.SQLSERVER.OLEDB.CE.2.0;"+

"Data Source=\\BazaLocal.sdf";

Gdy wszystkie parametry są już ustawione, rozpoczynamy subskrypcję:

repl.AddSubscription(AddOption.CreateDatabase);

oraz synchronizujemy dane:

repl.Synchronize();

W tym momencie możemy wykonywać dowolne operacje na lokalnej bazie danych, za pomocą znanych już obiektów:

SqlCeConnection SQLCONN;

SqlCeEngine SQLENG;

SqlCeCommand SQLCMD;

SqlCeDataReader SQLDR;

co jakiś czas wywołując metodę Synchronize, która zaktualizuje dane na serwerze SQL, a jednocześnie wprowadzi do lokalnej bazy wszystkie zmiany wprowadzone w bazie zdalnej. Gdy lokalna praca z danymi zostanie definitywnie zakończona, tzn. nie będą już więcej wykonywane żadne operacje synchronizacji danych, należy zakończyć subskrypcję:

repl.DropSubscription(DropOption.DropDatabase);

W ten sposób poinformujemy serwer SQL, że dany klient nie potrzebuje już dłużej replikować danych oraz usunie lokalną bazę danych z komputera Pocket PC.

Podsumowanie

Powyższe przykłady pokazują, że wykorzystując SQL Server 2000 w połączeniu z bazą SQL Server CE 2.0, używając Visual Studio.NET z Pocket PC 2003 SDK, a także korzystając z zalet .NET Compact Framework, można naprawdę łatwo i szybko zapewnić klientom mobilnym dostęp do danych przechowywanych na firmowych serwerach baz danych. Należy przy tym zauważyć, że stwierdzenie to jest prawdziwe dopiero po spełnieniu pewnych warunków, bo szara rzeczywistość wymusza uprzednie rozwiązanie wielu problemów kompatybilności pakietów i komponentów oraz zastosowania odpowiednich kombinacji service packów i łatek.