sobota, 8 listopada 2014

Migracja struktur danych z MS SQL Server do SQLite

Link do programu: SQLConverter.rar

SQL Converter to prosta aplikacja, która służy do migracji struktur danych z bazy MS SQL Server do SQLite. Umożliwia przeniesienie tabel, widoków, kluczy podstawowych, indeksów, kluczy obcych oraz danych. Obsługuje konwersję wszystkich typów danych łącznie z geography, geometry i hierarchyid. Program został wyposażony w moduł testujący z poziomu którego można szybko podejrzeć dane, struktury, wykonać polecenie SQL oraz wykonać transfer danych z bazy SQLite do MS SQL Server celem sprawdzenia czy konwersja wykonała się poprawnie.

Na rysunku 1 pokazane jest główne okno programu, w którym wskazujemy źródło danych (MS SQL Server) oraz miejsce docelowe, czyli plik bazy danych SQLite, który dodatkowo możemy zabezpieczyć hasłem. Przed migracją struktur mamy do wyboru opcje migracji wszystkich tabel, widoków i danych lub wybieramy osobno interesujące nas obiekty.


Rysunek 1. Główne okno aplikacji

Po wykonanej migracji możemy przetestować efekty. Na rysunku 2 widać listę tabel oraz widoków utworzonych w bazie SQLite. Wykonując kilka prostych poleceń SQL można zobaczyć wyniki. Dodatkowo w ramach testu istnieje możliwość transferu wyników z powrotem do bazy MS SQL Server.
 


Rysunek 2. Okno podglądu struktur i danych


środa, 17 września 2014

Jak powinna wyglądać ergonomia pracy ze SQLite w Windows Phone 8!

Link do projektu: TestSqlite.rar

Wymagania
Visual Studio: 2012
SQLite for Windows Phone: 3.8.6

Warsztat narzędzi oraz wygoda ich używania dla programistów jest najważniejszą kwestią w codziennej pracy zawodowej. W rzeczywistości deweloperzy mogą wskazywać kierunek i nakreślić użyteczność różnych rozwiązań technologicznych - w dużym stopniu. Wspominam o tym bo zdarza się, że producenci wprowadzając na rynek nowe rozwiązania czasami o tym zapominają. Każdy z programistów pamięta początki i ile potu wylał na klawiaturę zanim ujarzmił bazę danych w systemie Windows Phone 8. Osobiście byłem rozczarowany faktem, że Microsoft zablokował bezpośredni dostęp do bazy danych SQL Server Compact, pozostawiając nam jedynie do dyspozycji LINQ. W rezultacie zniknęły nam z oczu najważniejsze przestrzenie dla sektora biznesowego: System.Data.SqlServerCe i System.Data.SqlClient. Zwracam uwagę na wyraz "zniknęły", ponieważ defakto składowe z przestrzeni System.Data.SqlServerCe zmieniły tylko lokalizację i modyfikator dostępu! Dla zainteresowanych podam, że wszystkie składowe z przestrzeni System.Data.SqlServerCe, do których od lat przyzwyczajeni byli programiści znajdują się teraz w bibliotece Microsoft.Phone.Data.Internal.dll.

Okiełznanie bazy SQLite w systemie mobilnym Windows Phone 8

Temat ujarzmienia bazy danych SQLite został już przez większość z nas opanowany dzięki wytrwałej społeczności. Napisano na ten temat kilka dobrych artykułów, do których podaję linki i nie będę się w temat wgłębiał.

Linki:
Working with SQLite in Windows Phone 8: a sqlite-net version for mobile

Ergonomia pracy z bazą danych SQLite w systemie Windows Phone 8

Mówiąc o wygodzie pracy trzeba zaznaczyć, że powstało kilka rozwiązań. Jednym z najlepszych narzędzi będzie opcja pobierania potrzebnych bibliotek bezpośrednio ze środowiska Visual Studio poprzez klienta NuGet. Inna opcja to ręczne pobranie bibliotek SQLite ze strony: http://www.sqlite.org/download.html#wp8

Mnogość bibliotek może na początku sprawiać trudności w odpowiednim ich doborze w zależności od tego na jakim systemie operacyjnym będziemy uruchamiać nasze aplikacje. Jeśli ograniczamy się do systemu Windows Phone 8 to poruszamy się w obrębie architektury ARM i tutaj mamy do wyboru tak naprawdę niewiele. Istnieje biblioteka System.Data.SQLite, której funkcjonalność zapewnia swobodną pracę, jednak nie jest ona przeznaczona dla systemu Windows Phone 8. To co obecnie dostępne jest dla systemu mobilnego, są to niestety moim zdaniem tylko i wyłącznie "zaślepki", które nie zapewniają wygody i ergonomii pracy.

Uzupełnienie braków

Przedstawiam tu propozycję rozwiązania, czyli uzupełnienie braków i wyciągnięcie niektórych części kodu na światło dzienne. Projekt, który udostępniam zawiera rozwiązania zaczerpnięte ze źródeł biblioteki System.Data.SQLite (link powyżej) i kodów źródłowych .NET.

Link do kodów źródłowych .NET

Z racji ograniczeń licencji kodów źródłowych .NET projekt przedstawiam jako poglądowe rozwiązanie, które obrazuje jakie można uzyskać możliwości. Poniżej dla zobrazowania zamieszczam skróconą listę "odzyskanych" przestrzeni nazw i składowych. Link do projektu zamieszczony jest na początku opracowania.

Skrócona lista "odzyskanych" składowych:

System.Data.Linq.SqlClient.SqlFactory
System.Data.Linq.SqlClient.SQLiteBuilder
System.Data.Linq.SQLiteDataContext
      Methods:
            public string GetQueryText(Expression query)
            public string GetQueryText(Expression query, out DbParameter[] parameters)
            public DbCommand GetCommand(IQueryable query)
            public DbCommand GetCommand(Expression query)
            public DbCommand GetCommand(Expression query, DbConnection connection)
            public int ExecuteCommand(string command)
            public int ExecuteCommand(string command, params object[] parameters)
            public IEnumerable<TResult> ExecuteQuery<TResult>(string query)
            public IEnumerable<TResult> ExecuteQuery<TResult>(string query, params object[] parameters)
            public IEnumerable ExecuteQuery(Type elementType, string query, params object[] parameters)
            public IEnumerable<TResult> Translate<TResult>(DbDataReader reader)
            public IEnumerable Translate(Type elementType, DbDataReader reader)
            public IMultipleResults Translate(DbDataReader reader)
...
System.Data.SQLite.SQLiteCommand
System.Data.SQLite.SQLiteConnection
System.Data.SQLite.SQLiteDataAdapter
System.Data.SQLite.SQLiteDataReader
System.Data.SQLite.SQLiteParameter
System.Data.SQLite.SQLiteTransaction
...
System.Data.DataRelation
System.Data.DataRow
System.Data.DataSet
System.Data.DataTable
System.Data.DataView
...

Projekt System - ogólne informacje

Biblioteka System zbiera w jednym miejscu sporo brakujących składowych tj. klasy dostępu do bazy danych SQLite, kolekcji, typów danych itp. Otrzymujemy funkcjonalność LINQ + SQLite, klasy DataSet, DataTable i wiele innych.

Kilka wskazówek:
  1. LINQ to SQL Class – utworzone klasy w standardowym projekcie desktopowym możemy przenosić do projektu Windows Phone 8. Wszystkie wygenerowane składowe typu System.Data.Linq.Table w pliku *.designer należy zmienić na System.Data.Linq.TableEntity. W projekcie desktopowym wygenerowana klasa kontekstu dziedziczy po klasie System.Data.Linq.DataContext, natomiast w projekcie mobilnym musi dziedziczyć po System.Data.Linq.SQLiteDataContext.
  2. Klasa SQLiteCommand posiada kilka dodatkowych rozszerzeń, które umożliwiają wykonywanie poleceń SQL takich jak: SELECT, UPDATE, DELETE, INSERT na podstawie metadanych przekazanego obiektu.
  3. Klasa System.Data.Linq.SQLiteDataContext dziedziczy po standardowej klasie dostępnej w .NET System.Data.Linq.DataContext ale ma większe możliwości zaczerpnięte z wersji desktopowej. Umożliwia wykonywanie poleceń SQL z poziomu LINQ, translację wyniku zapytania SQL na wskazany typ obiektu itp.
  4. Do rozwiązania załączono projekt z przykładami wykorzystania bazy danych SQLite + LINQ oraz klas z przestrzeni System.Data.SQLite. Pokazano wiele wariantów i możliwości projektowych.

Projekt Sqlite - Runtime Component (Wrapper)

Aby wszystko powyższe było możliwe została rozszerzona funkcjonalność komponentu Sqlite. Obecnie biblioteka implementuje ponad setkę wymaganych funkcji.