Serdecznie zapraszam na stronę fotoRAF – moje fotografie z ofertą dotyczącą fotografii.
Wiele aplikacji potrzebuje gromadzić dane na których może pracować po ponownym uruchomieniu. Można tego dokonać w najróżniejszy sposób – tworzyć własne formaty plików, w których dane będą zapisywane, można serializować obiekty do plików, można wreszcie zapisywać dane w bazach danych – w typ także plikowych. Tutaj właśnie pojawia się SQLite (https://www.sqlite.org/) czyli baza danych, która w wielu prostych zastosowaniach sprawdzi się doskonale. Nie trzeba będzie instalować specjalnej bazy danych (serwera baz danych jak przy MySQL, SQLServer czy Oracle) a wszystkie dane zostaną zapisane w pliku. Tyle tytułem wstępu.
Cały projekt w formie projektu VS2015 można pobrać stąd -> SQLiteWinForms
Chcąc wykorzystać SQLite w projekcie Visual Studio musimy utworzyć projekt oraz dodać do niego przy pomocy NuGet Package Managera odpowiednie zasoby czyli SQLite. Tutaj mała dygresja. Chcąc używać SQLite i móc podglądać co ląduje nam w bazie danych i jak ona wygląda (także administrować ją) dobrze jest używać narzędzia – może być to np. DB Browser for SQLite https://sqlitebrowser.org/).
Po dodaniu niezbędnych zasobów do naszego projektu konieczne będzie utworzenie bazy danych. Można tego dokonać z poziomu podanego wcześniej narzędzia lub z poziomu kodu. Tworzenie bazy z poziomu kodu z pewnością będzie bardziej „cool”, „jazzy” & „trendy” no ale co kto lubi.
Teraz tylko pozostaje zadziałać. Utworzenie bazy danych sprowadza się do wywołania metody SQLiteConnection.CreateFile(string databaseFileName); Utworzony w sten sposób plik będzie naszą bazą danych SQLite.
Mając utworzony plik bazy danych kolejnym krokiem będzie dodanie tabel do bazy. Zrobić można to z poziomu kodu. Wpierw tworzymy połączenie z bazą danych. Następnie string polecenia SQL, który będzie wykonywany w komendzie SQL a następnie samą komendę SQL korzystającą z tego połączenia i stringu SQL.
private void CreateSQLiteTables() { using (cn = new SQLiteConnection(strConnection)) { string sql = "CREATE TABLE 'todoevents'('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'date' TEXT, 'title' TEXT, 'description' TEXT);"; Console.WriteLine(sql); try { cn.Open(); SQLiteCommand cmd = new SQLiteCommand(sql, cn); cmd.ExecuteNonQuery(); MessageBox.Show("Utworzono tabelę w bazie danych", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Information); cn.Close(); } catch (Exception ex) { MessageBox.Show(ex.HResult + "\n" + ex.Message, "Błąd programu", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
Gdy mamy już utworzoną bazę danych możemy pokusić się o dodawanie danych do niej. Jak? Tworzymy na formatce kilka pól tekstowych (tak jak na załączonym obrazku i jak w załączonym projekcie), które będą służyć nam do wprowadzania danych. Dodajemy przycisk dodawania nowych zadań, który będzie wywoływać poniższą metodę:
private void AddNewTask() { if (txtTitle.Text.Length > 0 && txtDescription.Text.Length > 0) { using (cn = new SQLiteConnection(strConnection)) { cn.Open(); string sql = "INSERT INTO todoevents(date, title, description) VALUES(@param1, @param2, @param3)"; SQLiteParameter param1 = new SQLiteParameter("param1", DbType.DateTime); SQLiteParameter param2 = new SQLiteParameter("param2", DbType.String); SQLiteParameter param3 = new SQLiteParameter("param3", DbType.String); SQLiteCommand cmd = new SQLiteCommand(sql, cn); cmd.Parameters.Add(param1); cmd.Parameters.Add(param2); cmd.Parameters.Add(param3); param1.Value = DateTime.Now.ToString(); param2.Value = txtTitle.Text; param3.Value = txtDescription.Text; try { cmd.ExecuteNonQuery(); txtTitle.Text = string.Empty; txtDescription.Text = string.Empty; RefreshListView(); } catch (Exception ex) { MessageBox.Show(ex.HResult + "\n" + ex.Message, "Błąd programu", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } else { MessageBox.Show("Niepoprawne dane", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
Wywoływana w powyższym kodzie metoda „RefershListView()” służy do odświeżenia zawartości kontrolki ListView wyświetlającej dane z bazy. Oczywiście można to zrobić także z wykorzystaniem kontrolki DataGridView. Poniżej kod tej metody:
private void RefreshListView() { lv1.Items.Clear(); using (cn = new SQLiteConnection(strConnection)) { string sql = "SELECT * FROM todoevents"; try { SQLiteCommand cmd = new SQLiteCommand(sql, cn); cn.Open(); SQLiteDataReader dr = cmd.ExecuteReader(); if (dr.HasRows) { while (dr.Read()) { Console.WriteLine(dr[0] + ";" + dr[1] + ";" + dr[2] + ";" + dr[3]); ListViewItem item = new ListViewItem(new string[] { dr[0].ToString(), dr[1].ToString(), dr[2].ToString(), dr[3].ToString() }); lv1.Items.Add(item); } } } catch (Exception ex) { MessageBox.Show(ex.HResult + "\n" + ex.Message, "Błąd programu", MessageBoxButtons.OK, MessageBoxIcon.Error); } cn.Close(); } }
Cały projekt w formie projektu VS2015 można pobrać stąd -> SQLiteWinForms. Jeśli ktoś będzie zainteresowany to może zobaczyć jak można wykorzystać SQLite do prostych aplikacji.