Własne spostrzeżenia :
Biblioteka do sqlite jest naprawdę dobra. Schematy wyświetlane są prawidłowo, klasy TableAdapterManagera i poszczególnych adapterów tworzone są wg. templateów MS.
W .NET 3.5 pojawił się element TableAdapterManagera. Jest to chyba stosunkowo nowy objekt. Automatycznie tworzone są też adaptery dla poszczególnych tablic. Dodatkowo dla każdych wywołań tworzona jest transakcja. Nie trzeba pisać samemu obsługi ani programować operacji CRUD dla poszczególnych adapterów. Nie znalazłem na necie za dużo informacji o tym, jak stosować TableAdaptermanagera i Adapterów automatycznie wygenerowanych, podam tu w skrócie, jak ja ich używałem. Wszelkie komentarze mile widziane.
1. Inicjalizowanie obiektów.
a) najpierw tworzę obiekt TableAdapterManagera
b) potem tworzę obiekt konkretnego adaptera dla konkretnej tablicy
c) potem przypisuję TableAdapterManagerowi odpowiedni adapter :
private SkypeResponderDataSetTableAdapters.TableAdapterManager adapterManager; private SkypeResponderDataSetTableAdapters.skypeUsersTableAdapter usersAdapter;
Dodatkowo jeszcze deklaruję DataSet:
private SkypeResponderDataSet ds;
Potem w konstruktorze :
ds = new SkypeResponderDataSet(); adapterManager = new SkypeResponder.SkypeResponderDataSetTableAdapters.TableAdapterManager(); usersAdapter = new SkypeResponder.SkypeResponderDataSetTableAdapters.skypeUsersTableAdapter();
Potem już tylko wystarczy operować na zainicjalizowanym objekcie DataSeta. Np. procedura dodania usera :
1. Utworzenie nowego wiersza tablicy skypeUsers :
SkypeResponderDataSet.skypeUsersRow sur = ds.skypeUsers.NewskypeUsersRow();
2. Mapowanie pól wiersz <- objekt usera
sur.client = sus.Client; sur.usernick = sus.UserNick; sur.respondmessage = sus.RespondMessage; sur.autorespond = long.Parse(auto); sur.emailsendchatperiod = long.Parse(sus.EmailSendChatPeriod.ToString()); sur.emailchatornot = long.Parse(emailchat);
3. Dodanie nowego wiersza do tablicy bazy :
ds.skypeUsers.AddskypeUsersRow(sur);
4. Update całego DataSetu.
adapterManager.UpdateAll(ds);
W trakcie updateAll TableManager wykonuje :
1. W sekcji <Prepare for update> ustawia połączenie + transakcje
2. W sekcji <Commit updates> komituje transakcje i kończy operacje na bazie.
Podczas programowania pojawił się problem, jak wrzucić zapytanie o konkretne wiersze z tablicy.
Adapter dla danej tablicy ma defaultowo ustawionegą operację Fill na select * from <table>. Koniec. Operacja select zapisana jest w kolekcji CommandCollection pod indexem 0. Problem polega na tym, że kolekcja jest prywatna. Ale, co warto podkreślić, klasa adaptera, każdego to partial class
Stąd możemy sobie w innym miejscu dorobić metodę, która wykorzysta naszą SqlCommand.
public partial class skypeUsersTableAdapter
{
public int FillWithCustomSelectCommand(SkypeResponderDataSet.skypeUsersDataTable
dataTable, System.Data.SQLite.SQLiteCommand command)
{
System.Data.SQLite.SQLiteCommand command1 = this.CommandCollection[0];
try
{
this.CommandCollection[0] = command;
return this.Fill(dataTable);
}
finally
{
this.CommandCollection[0] = command1;
}
}
}
Najpierw kopiujemy starą komendę, potem wrzucamy do kolekcji naszą,a po wypełnieniu tablicy, przywracamy starą komendę w jej prawowite miejsce. Wydaje mi się, że jest to w miarę rozsądne rozwiązanie.