SQLite w Visual Studio

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.

Avatar

Autor: gervee

Pełnoetatowy ojciec małej gromadki, programista(?), "amator" fotograf, "dłubacz" lubiący DIY, miłośnik chmielonego napitku. "Żartowniś" bez poczucia humoru ;).

Dodaj komentarz