{"id":551,"date":"2016-05-19T05:08:27","date_gmt":"2016-05-19T03:08:27","guid":{"rendered":"http:\/\/www.daniel.slask.pl\/?p=551"},"modified":"2021-02-12T21:02:03","modified_gmt":"2021-02-12T20:02:03","slug":"visual-studio-2015-obsluga-lokalnej-bazy-danych-przy-uzyciu-sqlite-jezykiem-poczatkujacego","status":"publish","type":"post","link":"https:\/\/daniel.slask.pl\/m\/visual-studio-2015-obsluga-lokalnej-bazy-danych-przy-uzyciu-sqlite-jezykiem-poczatkujacego\/","title":{"rendered":"[Visual Studio 2015] Obs\u0142uga lokalnej bazy danych przy u\u017cyciu SQLite &#8211; j\u0119zykiem pocz\u0105tkuj\u0105cego"},"content":{"rendered":"\n<p>Witam.<\/p>\n\n\n\n<p>Pewnie ka\u017cdy pocz\u0105tkuj\u0105cy programista zastanawia\u0142 si\u0119 jak i gdzie zapisa\u0107 du\u017co danych i w \u0142atwy spos\u00f3b mie\u0107 do nich dost\u0119p. Mo\u017cliwe jest wykorzystanie plik\u00f3w tekstowych, lecz dost\u0119p do danych jest do\u015b\u0107 utrudniony. Mo\u017cna wykorzysta\u0107 r\u00f3wnie\u017c pliki <em>XML<\/em> (z <span class=\"st\">ang. <em>Extensible Markup Language<\/em><\/span>) lub bazy danych. W tym wpisie zajmiemy si\u0119 obs\u0142ug\u0105 lokalnych baz danych z wykorzystaniem biblioteki <em><strong>SQLite<\/strong><\/em>.<\/p>\n\n\n\n<p>Dlaczego lokalna baza danych &#8211; jest prosty pow\u00f3d, ot\u00f3\u017c chyba ka\u017cdy chce, aby jego program uruchamia\u0142 si\u0119 na ka\u017cdym komputerze bez instalowania dodatkowych program\u00f3w czy bibliotek. Jedynie u\u017cytkownikowi wraz z programem b\u0119dziemy dostarcza\u0107 pliki (z regu\u0142y s\u0105 to tylko pliki <em>dll<\/em>), kt\u00f3re b\u0119d\u0119 kopiowane wraz z programem wykonywalnym (*.<em>exe<\/em>). W niedalekiej przysz\u0142o\u015bci poka\u017c\u0119, jak doda\u0107 i obs\u0142u\u017cy\u0107 te pliki biblioteczne tak, aby dost\u0119pny by\u0142 tylko jeden plik exe &#8211; ale to jest temat przysz\u0142o\u015bciowy.<\/p>\n\n\n\n<p>We wst\u0119pie zaznacz\u0119 jeszcze, \u017ce podczas omawiania zagadnie\u0144 zwi\u0105zanych z obs\u0142ug\u0105 <em><strong>SQLite<\/strong> <\/em>zak\u0142adam, \u017ce znasz podstawy podstaw obs\u0142ugi <em>Visual Studio 2015<\/em> i programowania w <em>C#<\/em>. Obs\u0142ug\u0119 lokalnej bazy danych przedstawi\u0119 na prostym przyk\u0142adzie, natomiast na ko\u0144cu zamieszczam r\u00f3wnie\u017c program &#8222;<em>Ksi\u0105\u017cka adresowa<\/em>&#8222;, kt\u00f3ra przedstawia w obszerniejszy spos\u00f3b dzia\u0142anie bazy danych, oraz przedstawia inne ciekawe mechanizmy, kt\u00f3re pewnie wykorzystasz. Programu tego jednak omawia\u0107 nie b\u0119d\u0119, ale w kodzie \u017ar\u00f3d\u0142owym znajduje si\u0119 do\u015b\u0107 du\u017co komentarzy opisuj\u0105cych poszczeg\u00f3lne czynno\u015bci. R\u00f3wnie\u017c zagadnie\u0144 dotycz\u0105cych samego <em><strong>SQL<\/strong> <\/em>nie b\u0119d\u0119 omawia\u0142 &#8211; jedynie podam link, gdzie mo\u017cna znale\u017a\u0107 przydatne materia\u0142y.<\/p>\n\n\n\n<p>Tak wi\u0119c zaczynamy zabaw\u0119 z lokaln\u0105 baz\u0105 danych!!<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Przed przyst\u0105pieniem do pisania programu, nale\u017cy najpierw zaimportowa\u0107 i doda\u0107 potrzebne biblioteki. Mo\u017cna to zrobi\u0107 na wiele sposob\u00f3w. Jednym z nich jest \u015bci\u0105gni\u0119cie odpowiednich plik\u00f3w ze strony \u017ar\u00f3d\u0142owej <a href=\"http:\/\/system.data.sqlite.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">SQLite<\/a>. Tylko, kt\u00f3r\u0105 wersj\u0119 wybra\u0107 i jakie pliki? Jest te\u017c du\u017ce prawdopodobie\u0144stwo, \u017ce braknie biblioteki <strong><em>SQLite.Interop.dll<\/em><\/strong>. Ja natomiast poka\u017c\u0119 inny spos\u00f3b, kt\u00f3ry w \u0142atwy spos\u00f3b doda wszystkie potrzebne pliki &#8211; ot\u00f3\u017c poprzez sam program <em>Visual<\/em> dzi\u0119ki pakietom <em>NuGet<\/em>. Aby tego dokona\u0107 nale\u017cy w eksploratorze projektu klikn\u0105\u0107 prawym przyciskiem myszy na <em>odwo\u0142ania<\/em> (<em><span id=\"result_box\" class=\"short_text\" lang=\"en\"><span class=\"alt-edited\">references<\/span><\/span><\/em>) i z menu wybra\u0107 &#8222;<em>Zarz\u0105dzaj pakietami NuGet&#8230;<\/em>&#8221; tak jak to pokazano na poni\u017cszym rysunku:<\/p>\n\n\n\n\n\t\t<style type=\"text\/css\">\n\t\t\t#gallery-1 {\n\t\t\t\tmargin: auto;\n\t\t\t}\n\t\t\t#gallery-1 .gallery-item {\n\t\t\t\tfloat: left;\n\t\t\t\tmargin-top: 10px;\n\t\t\t\ttext-align: center;\n\t\t\t\twidth: 20%;\n\t\t\t}\n\t\t\t#gallery-1 img {\n\t\t\t\tborder: 2px solid #cfcfcf;\n\t\t\t}\n\t\t\t#gallery-1 .gallery-caption {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\t\t\t\/* see gallery_shortcode() in wp-includes\/media.php *\/\n\t\t<\/style>\n\t\t<div id='gallery-1' class='gallery galleryid-551 gallery-columns-5 gallery-size-thumbnail'><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/dodanie_nowego_pakietu.jpg'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/dodanie_nowego_pakietu-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" aria-describedby=\"gallery-1-553\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-553'>\n\t\t\t\tDodanie nowego pakietu NuGet\n\t\t\t\t<\/dd><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/wybranie_pakiet\u00f3w.jpg'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/wybranie_pakiet\u00f3w-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" aria-describedby=\"gallery-1-557\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-557'>\n\t\t\t\tWyb\u00f3r pakietu NuGet\n\t\t\t\t<\/dd><\/dl>\n\t\t\t<br style='clear: both' \/>\n\t\t<\/div>\n\n\n\n\n<p>Otworzy nam si\u0119 nowe okienko w kt\u00f3rym mamy mo\u017cliwo\u015b\u0107 wyboru odpowiedniego pakietu. W tym celu przechodzimy do zak\u0142adki <em>Przegl\u0105daj<\/em> i w polu wyszukiwania wpisujemy <em><strong>SQLite<\/strong><\/em>. Po wyszukaniu i wy\u015bwietlenie wynik\u00f3w wybieramy pakiet <em><strong>System.Data.SQLite<\/strong><\/em> (tak jak to pokazano na wcze\u015bniejszym zdj\u0119ciu). Po prawej stronie w informacjach dotycz\u0105cych pakietu naciskami przycisk <em>Zainstaluj<\/em>, oraz potwierdzamy <em>OK<\/em> w kolejnym okienku. Wszystkie wymagane sk\u0142adniki pakietu zostan\u0105 automatycznie zainstalowane. Dzi\u0119ki temu pakietowi, jeste\u015bmy pewni, \u017ce mamy aktualne biblioteki i wszystkie pliki, kt\u00f3re s\u0105 wymagane do prawid\u0142owego dzia\u0142ania naszej aplikacji.<\/p>\n\n\n\n<p>Aby sprawdzi\u0107 czy pakiet doda\u0142 odpowiednie pliki do projektu nale\u017cy rozwin\u0105\u0107 kategorie odwo\u0142ania w naszym projekcie. Powinny znajdowa\u0107 si\u0119 tam takie odwo\u0142ania jak <em><strong>System.Data.SQLite<\/strong><\/em>, <em><strong>System.Data.SQLite.EF6<\/strong><\/em>, <em><strong>System.Data.SQLite.Linq<\/strong><\/em>. Nale\u017cy jeszcze sprawdzi\u0107 czy kopia lokalna jest tworzona. Po zaznaczeniu odpowiedniego odwo\u0142ania (oczywi\u015bcie dotycz\u0105cego tylko <em><strong>SQLite<\/strong><\/em>) w okienku <em>w\u0142a\u015bciwo\u015bci<\/em> (<em>Properties<\/em>) przy opcji <em>kopia lokalna<\/em> (<em>Copy Local<\/em>) powinno by\u0107 ustawione <em><strong>True<\/strong><\/em>, jak to pokazano na poni\u017cszym zdj\u0119ciu:<\/p>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/Ustawienie-odwo\u0142a\u0144.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/Ustawienie-odwo\u0142a\u0144-150x150.jpg\" alt=\"Odpowiednie ustawienie odwo\u0142a\u0144\" class=\"wp-image-556\"\/><\/a><figcaption>Odpowiednie ustawienie odwo\u0142a\u0144<\/figcaption><\/figure>\n\n\n\n<p>Dzi\u0119ki temu ustawieniu w folderze w kt\u00f3rym znajduje si\u0119 nasz plik wykonywalny <em>exe<\/em> naszego programu zostan\u0105 utworzone pliki kt\u00f3re s\u0105 konieczne do prawid\u0142owego dzia\u0142ania naszego programu. W jednym z nast\u0119pnych wpis\u00f3w poka\u017c\u0119 jak doda\u0107 pliki biblioteczne, aby by\u0142y one dodane bezpo\u015brednio do pliku wykonywalnego bez tworzenia dodatkowych plik\u00f3w.<\/p>\n\n\n\n<p>Po tych kilku zabiegach mamy ju\u017c dost\u0119pn\u0105 bibliotek\u0119 potrzebn\u0105 do obs\u0142ugi lokalnej bazy danych. Teraz zajmiemy si\u0119 tworzeniem programu.<\/p>\n\n\n\n<p>Om\u00f3wi\u0119 jedynie <span style=\"text-decoration: underline;\">fragmenty<\/span> kodu, kt\u00f3re s\u0105 potrzebne do obs\u0142ugi bazy danych. Reszta kodu jest opisana w projekcie, kt\u00f3ry jest do\u0142\u0105czony na samym ko\u0144cu tego wpisu.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Pod <a href=\"https:\/\/pl.wikibooks.org\/wiki\/SQL\/Zapytania_SQL\" target=\"_blank\" rel=\"noopener noreferrer\">tym adresem<\/a> mo\u017cna znale\u017a\u0107 przydatne informacje dot. budowania sk\u0142adni zapyta\u0144 <em>SQL<\/em>.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Nasz program b\u0119dzie umo\u017cliwia\u0142 utworzenie nowej bazy danych, otwarcie istniej\u0105cej, oraz dodanie i usuni\u0119cie danych, a tak\u017ce wypisanie kolejnych danych, kt\u00f3re s\u0105 zawarte w bazie danych. W projekcie zostan\u0105 u\u017cyte nast\u0119puj\u0105ce kontrolki:<\/p>\n\n\n\n<ol><li>Button;<\/li><li>TextBox;<\/li><li>Label<\/li><\/ol>\n\n\n\n<p>Wygl\u0105da\u0107 to b\u0119dzie nast\u0119puj\u0105co:<\/p>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/Dzia\u0142aj\u0105cy-program.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/Dzia\u0142aj\u0105cy-program-150x150.jpg\" alt=\"Dzia\u0142aj\u0105cy program\" class=\"wp-image-560\"\/><\/a><figcaption>Dzia\u0142aj\u0105cy program<\/figcaption><\/figure>\n\n\n\n<p>Obs\u0142ug\u0119 lokalnej bazy danych mo\u017cna podzieli\u0107 na kilka czynno\u015bci:<\/p>\n\n\n\n<ol><li>Utworzenie nowego pliku<\/li><li>Otwarcie\/Zamkni\u0119cie bazy danych<\/li><li>Wys\u0142anie zapytania, kt\u00f3re nie zwraca \u017cadnych danych (np. utworzenie tabeli, dodanie nowych danych)<\/li><li>Wys\u0142anie zapytanie, kt\u00f3re zwraca jaki\u015b wynik (np, wyszukanie danych)<\/li><\/ol>\n\n\n\n<p>W pierwszej kolejno\u015bci zarejestrujemy przestrze\u0144 nazw naszej biblioteki, aby \u0142atwiej nam si\u0119 programowa\u0142o:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c# decode:true\"><code lang=\"csharp\" class=\"language-csharp\">using System.Data.SQLite;<\/code><\/pre>\n\n\n\n<p>Aby utworzy\u0107 nowy plik naszej bazy nale\u017cy wywo\u0142a\u0107 funkcj\u0119:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c# decode:true\"><code lang=\"csharp\" class=\"language-csharp\">\/\/tworzenie nowego pliku\nSQLiteConnection.CreateFile(\"c:\\\\nowe_dane.db\");<\/code><\/pre>\n\n\n\n<p>W programie, kt\u00f3ry przedstawia spos\u00f3b wykorzystania bazy danych do funkcji przekazywana jest zmienna <em>path<\/em>, kt\u00f3ra zawiera lokalizacj\u0119 pliku. Dwa uko\u015bniki s\u0105 stosowane z tego powodu, \u017ce jeden traktowany jest jako znak specjalny, na kt\u00f3ry reaguje kompilator. Po utworzeniu pliku konieczne jest utworzenie nowej tabeli w bazie danych, ale o tym za chwil\u0119.<\/p>\n\n\n\n<p>Otwarcie pliku wymaga utworzenia najpierw zmiennej, do kt\u00f3rej przypisany b\u0119dzie nasz obiekt, czyli plik naszej bazy danych.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c# decode:true\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">\/\/zmienna przechowuj\u0105ca obiekt bazy danych\nSQLiteConnection db_connect;         \n\n\/\/utworzenie obiektu potrzebnego do po\u0142\u0105czenia si\u0119 z baz\u0105, sk\u0142adnia wymagana przez bibliotek\u0119.\ndb_connect = new SQLiteConnection(\"Data Source =\" + path + \";Version=3;\");\n\n\/\/po\u0142\u0105czenie si\u0119 z baz\u0105 danych - funkcja tworz\u0105ca nowy plik nie powoduje otwarcia go\ndb_connect.Open();<\/code><\/pre>\n\n\n\n<p>Nast\u0119pnie tworzymy obiekt, kt\u00f3ry przypisany jest do wcze\u015bniej utworzonej zmiennej. Jako parametr przekazywana jest sk\u0142adnia zawieraj\u0105ca adres naszego pliku, oraz wersj\u0119 bazy danych. Mo\u017cliwe jest r\u00f3wnie\u017c przes\u0142anie innych informacji, takich jak has\u0142o, ale na chwil\u0119 obecn\u0105 nie zajmowa\u0142em si\u0119 tym. Informacje na temat tej sk\u0142adni mo\u017cna znale\u017a\u0107 pod <a href=\"http:\/\/www.connectionstrings.com\/sqlite\/\" target=\"_blank\" rel=\"noopener noreferrer\">tym adresem<\/a> &#8211; i nie tylko. W ostatniej linijce poprzez wywo\u0142anie funkcji\/metody <em>Open()<\/em> otwierane jest po\u0142\u0105czenie z baz\u0105 danych. Zamkni\u0119cie bazy danych wykonuje si\u0119 w bardzo prosty spos\u00f3b, poprzez wywo\u0142anie metody\/funkcji <em>Close()<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c# decode:true\"><code lang=\"csharp\" class=\"language-csharp\">\/\/zamkni\u0119cie po\u0142\u0105czenia z baz\u0105 danych\ndb_connect.Close();<\/code><\/pre>\n\n\n\n<p>Warto tutaj wspomnie\u0107, \u017ce w przypadku, gdy plik pod wskazanym adresem nie istnieje, a zostanie wywo\u0142ana funkcja\/metoda <em>Open()<\/em>, plik ten zostanie utworzony. Jednak nie zalecane jest tworzenie w ten spos\u00f3b nowych plik\u00f3w, z tego wzgl\u0119du, \u017ce mog\u0105 one zawiera\u0107 b\u0142\u0119dy.<\/p>\n\n\n\n<p>Po utworzeniu i otwarciu pliku, nale\u017cy w bazie danych utworzy\u0107 now\u0105 tabel\u0119. Przedstawi\u0119 najpierw, jak wygl\u0105da sk\u0142adnia wys\u0142ania zapytania bez zwrotu danych.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c# decode:true\"><code lang=\"csharp\" class=\"language-csharp\">\/\/zmienna przechowuj\u0105ca obiekt do wysy\u0142ania zapyta\u0144\nSQLiteCommand db_command;            \n\n\/\/utworzenie obiektu kt\u00f3ry odpowiada za wysy\u0142anie zapytania\ndb_command = new SQLiteCommand(db_querry, db_connect);\n\n\/\/wykonanie\/wys\u0142anie zapytania\ndb_command.ExecuteNonQuery();<\/code><\/pre>\n\n\n\n<p>W pierwszej kolejno\u015bci tworzona jest zmienna przechowuj\u0105ca obiekt odpowiedzialny za wysy\u0142anie zapytania, a w kolejnej tworzony jest ten obiekt. Przekazywane jest do niego zapytanie (<em>db_querry<\/em> jest zmienn\u0105 typu <em>string<\/em>, kt\u00f3ra w moim przypadku zawiera sk\u0142adni\u0119 zapytania), oraz zmienna przechowuj\u0105ca obiekt pod\u0142\u0105czonej bazy danych, kt\u00f3ry zosta\u0142 utworzony przed jego otwarcie. Po utworzeniu obiektu, wykonywane jest jego zapytanie poprzez wywo\u0142anie funkcji odpowiedzialnej za przes\u0142anie zapytania kt\u00f3re nie zwraca odpowiedzi.<\/p>\n\n\n\n<p>Przyk\u0142ad tworzenia nowego pliku wraz z utworzeniem nowej tabli przedstawia si\u0119 nast\u0119puj\u0105co:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c# decode:true\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">public string path = null;                  \/\/zmienna przechowuj\u0105ca lokalizacj\u0119 bazy danych\npublic SQLiteConnection db_connect;         \/\/zmienna przechowuj\u0105ca obiekt bazy danych\npublic string db_querry = null;             \/\/zmienna przechowuj\u0105ca zapytanie do bazy danych\npublic SQLiteCommand db_command;            \/\/zmienna przechowuj\u0105ca obiekt do wysy\u0142ania zapyta\u0144\n\n\/\/tworzenie nowego pliku i tutaj po tym nale\u017cy utworzy\u0107 tabel\u0119 w nowej bazie\nSQLiteConnection.CreateFile(path);\n\n\/\/utworzenie obiektu potrzebnego do po\u0142\u0105czenia si\u0119 z baz\u0105, sk\u0142adnia wymagana przez bibliotek\u0119.\ndb_connect = new SQLiteConnection(\"Data Source =\" + path + \";Version=3;\");\n\n\/\/po\u0142\u0105czenie si\u0119 z baz\u0105 danych - funkcja tworz\u0105ca nowy plik nie powoduje otwarcia go\ndb_connect.Open();\n\n\/\/utworzenie nowego zapytania dotycz\u0105cego utworzenia nowej tabeli w bazie danych\ndb_querry = \"CREATE TABLE 'Osoby' ( 'Imie' TEXT, 'Nazwisko' TEXT)\";\n\n\/\/utworzenie obiektu kt\u00f3ry odpowiada za wysy\u0142anie zapytania\ndb_command = new SQLiteCommand(db_querry, db_connect);\n\n\/\/wykonanie\/wys\u0142anie zapytania\ndb_command.ExecuteNonQuery();\n\n\/\/zamkni\u0119cie po\u0142\u0105czenia z baz\u0105 danych\ndb_connect.Close();<\/code><\/pre>\n\n\n\n<p>W tym przypadku tworzona jest nowa tabela kt\u00f3ra nosi nazw\u0119 &#8222;<em>Osoby<\/em>&#8222;. B\u0119dzie ona zawiera\u0142a kolumny &#8222;<em>Imie<\/em>&#8221; , oraz &#8222;<em>Nazwisko<\/em>&#8221; , kt\u00f3rych zawarto\u015b\u0107 b\u0119dzie typu <em>TEXT<\/em>.<\/p>\n\n\n\n<p>Natomiast dodanie nowych danych do tabeli wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c# decode:true\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">\/\/utworzenie nowego zapytania dodaj\u0105cego nowe dane do bazy\ndb_querry = \"INSERT INTO 'Osoby' ('Imie', 'Nazwisko') VALUES ('\"+ textBox2.Text +\"','\" + textBox3.Text + \"');\";\n\n\/\/utworzenie obiektu kt\u00f3ry odpowiada za wysy\u0142anie zapytania\ndb_command = new SQLiteCommand(db_querry, db_connect);\n\n\/\/wykonanie\/wys\u0142anie zapytania\ndb_command.ExecuteNonQuery();\n<\/code><\/pre>\n\n\n\n<p>Do tabeli &#8222;<em>Osoby<\/em>&#8221; do kolumny &#8222;<em>Imie<\/em>&#8221; , oraz &#8222;<em>Nazwisko<\/em>&#8221; dodane s\u0105 warto\u015bci wpisane do <em>textbox2<\/em>, oraz <em>textbox3<\/em>.<\/p>\n\n\n\n<p>Kolejna czynno\u015b\u0107 jaka jest wykonywana przy korzystaniu z bazy danych, to odczyt danych z tabeli bazy danych.&nbsp;Aby tego dokona\u0107, nale\u017cy najpierw utworzy\u0107 now\u0105 zmienn\u0105, z kt\u00f3rej b\u0119dziemy odczytywa\u0107 dane z kolejnych kolumn.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c# decode:true\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">\/\/zmienna przechowuj\u0105ca odebrane informacje zwr\u00f3cone dla zapytania doczytuj\u0105ceg\nSQLiteDataReader db_read;<\/code><\/pre>\n\n\n\n<p>Nast\u0119pnie do tej zmiennej przypisuje si\u0119 rezultat jaki zwraca funkcja wysy\u0142aj\u0105ca zapytanie zwi\u0105zane z odczytem danych.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c# decode:true\"><code lang=\"csharp\" class=\"language-csharp\">\/\/wykonanie zapytania odczytuj\u0105cego dane z bazy danych\ndb_read = db_command.ExecuteReader();<\/code><\/pre>\n\n\n\n<p>Tak odebrane&nbsp;dane z lokalnej bazy danych, s\u0105&nbsp;teraz gotowe aby je odczyta\u0107. Dokonuje si\u0119 tego poprzez wywo\u0142ywanie funkcji <em>Read()<\/em> &#8211; przed pierwszym odczytaniem danych nale\u017cy r\u00f3wnie\u017c j\u0105 wywo\u0142a\u0107. Odczyt danych wykonuje si\u0119 wiersz po wierszu, tzn. wywo\u0142anie funkcji <em>Read<\/em> powoduje przej\u015bcie do nast\u0119pnego wierszu. Odczytywanie danych dokonuje si\u0119 poprzez odczyt ka\u017cdej kom\u00f3rki z osobna. Dokonuje si\u0119 tego po kolei dla ka\u017cdego wiersza wskazuj\u0105c odpowiedni\u0105 kolumn\u0105:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c# decode:true\"><code lang=\"csharp\" class=\"language-csharp\">db_read.Read();                                 \/\/przed pierwszym u\u017cyciem te\u017c nale\u017cy u\u017cy\u0107 funkcji odczytuj\u0105cej dane z bazy\nlabel2.Text = db_read[\"Imie\"].ToString();       \/\/odczytywanie dokonuje si\u0119 poprzez wskazanie nazyw kolumny \nlabel3.Text = db_read[1].ToString();            \/\/b\u0105d\u017a poprzez podanie numeru kolumny - liczenie od 0\n<\/code><\/pre>\n\n\n\n<p>Odczyt danych&nbsp;z odpowiedniej kolumny dokonuje si\u0119 jak odczyt z tabeli 1 wymiarowej. Mo\u017cna wykorzysta\u0107 do tego indeks kolumny (liczy si\u0119 od 0) b\u0105d\u017a nazw\u0119 kolumny w bazie danych.<\/p>\n\n\n\n<p>Poni\u017cej zamieszczam ca\u0142y przyk\u0142ad umo\u017cliwiaj\u0105cy odczytanie danych z bazy danych.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c# decode:true\"><code lang=\"csharp\" class=\"language-csharp\">\/\/zmienna przechowuj\u0105ca odebrane informacje zwr\u00f3cone dla zapytania doczytuj\u0105ceg\npublic SQLiteDataReader db_read;            \n\n\/\/utworzenie nowego zapytania powoduj\u0105cego odczytanie\/wyszukanie wszystkich danych z bazy\ndb_querry = \"SELECT * FROM 'Osoby'\";\n\n\/\/utworzenie obiektu kt\u00f3ry odpowiada za wysy\u0142anie zapytania\ndb_command = new SQLiteCommand(db_querry, db_connect);\n\n\/\/wykonanie zapytania odczytuj\u0105cego dane z bazy danych\ndb_read = db_command.ExecuteReader();\n\n\/\/odczytywanie danych\ndb_read.Read();                                 \/\/przed pierwszym u\u017cyciem te\u017c nale\u017cy u\u017cy\u0107 funkcji odczytuj\u0105cej dane z bazy\nlabel2.Text = db_read[\"Imie\"].ToString();       \/\/odczytywanie dokonuje si\u0119 poprzez wskazanie nazyw kolumny \nlabel3.Text = db_read[1].ToString();            \/\/b\u0105d\u017a poprzez podanie numeru kolumny - liczenie od 0<\/code><\/pre>\n\n\n\n<p>Nale\u017cy wspomnie\u0107 r\u00f3wnie\u017c o tym, \u017ce w przypadku, gdy zostanie osi\u0105gni\u0119ty ostatni indeks, dane przestan\u0105 by\u0107 odczytywane. Warto w tej procedurze (jak i w pozosta\u0142ych procedurach) wykorzysta\u0107 sk\u0142adni\u0119 do przechwytywanie b\u0142\u0119du <em><strong>try &#8211; catch<\/strong><\/em>, aby program nie zako\u0144czy\u0142 swojego \u017cywot. Aby po osi\u0105gni\u0119ciu ostatniego indeksu m\u00f3c od pocz\u0105tku odczytywa\u0107 dane, nale\u017cy wykona\u0107 procedur\u0119 odczytu od pocz\u0105tku, tzn. od\u0142\u0105czy\u0107 si\u0119 od bazy danych, po\u0142\u0105czy\u0107 si\u0119 z ni\u0105 na nowo i wykona\u0107 zapytanie.<\/p>\n\n\n\n<p>Po poprawnym skompilowaniu programu w folderze DEBUG naszego projektu znajduje si\u0119 plik wykonywalny naszego projektu wraz z pozosta\u0142ymi plikami. Poni\u017cej na zdj\u0119ciach przedstawiam, jakie pliki musz\u0105 znale\u017a\u0107 si\u0119 na innym komputerze aby program dzia\u0142a\u0142 prawid\u0142owo (wersja minimalistyczna i maksymalistyczna \ud83d\ude09 ).<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-5 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/pliki_minimum.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"680\" height=\"317\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/pliki_minimum.jpg\" alt=\"\" data-id=\"555\" class=\"wp-image-555\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/pliki_minimum.jpg 680w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/pliki_minimum-300x140.jpg 300w\" sizes=\"(max-width: 680px) 100vw, 680px\" \/><\/a><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/pliki_max.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"680\" height=\"317\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/pliki_max.jpg\" alt=\"\" data-id=\"554\" class=\"wp-image-554\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/pliki_max.jpg 680w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/pliki_max-300x140.jpg 300w\" sizes=\"(max-width: 680px) 100vw, 680px\" \/><\/a><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>Mam nadziej\u0119, \u017ce w prosty i w przyjazny spos\u00f3b uda\u0142o mi si\u0119 przedstawi\u0107 obs\u0142ug\u0119 biblioteki <em><strong>SQLite<\/strong><\/em>. W przypadku jakich\u015b pyta\u0144, prosz\u0119 o feedback w postaci komentarza b\u0105d\u017a wiadomo\u015bci wys\u0142anej z formularza kontaktu.<\/p>\n\n\n\n<p>Je\u017celi natomiast macie jakie\u015b krytyczne opinie, b\u0105d\u017a je\u017celi co\u015b jest nie tak to te\u017c pisa\u0107 &#8211; b\u0119d\u0119 wiedzia\u0142 co zmieni\u0107 w tym i w przysz\u0142ych wpisach.<\/p>\n\n\n\n<p>Poni\u017cej udost\u0119pniam wam te projekty. Przed uruchomieniem projektu w programie<em> Visual Studio 2015<\/em> nale\u017cy najpierw skompilowa\u0107 projekt. Wymagany jest te\u017c dost\u0119p do internetu, gdy\u017c zosta\u0142y przeze mnie usuni\u0119te niekt\u00f3re pliki biblioteczne powoduj\u0105ce zwi\u0119kszenie obj\u0119to\u015bci ca\u0142ego projektu. W razie problem\u00f3w, to pisa\u0107 &#8211; prze\u015bl\u0119 bezpo\u015brednio na e-mail ca\u0142y kompletny projekt. W niedalekiej przysz\u0142o\u015bci postaram si\u0119 umie\u015bci te projekty na dysku <em>google<\/em> i udost\u0119pni\u0107 tutaj.<\/p>\n\n\n\n<p>Pliki do pobrania:<\/p>\n\n\n\n<a  data-e-Disable-Page-Transition=\"true\" class=\"download-link download-button aligncenter\" title=\"Wersja v1.0\" href=\"https:\/\/daniel.slask.pl\/m\/download\/570\/?tmstv=1788161164\" rel=\"nofollow\" id=\"download-link-570\" >\n\t<p>\n\t\tPobierz &ldquo;Cs_03_baza_danych_sqlite1.zip&rdquo;\t<\/p>\n\t<small>Cs_03_baza_danych_sqlite1.zip\t\t&ndash; Pobrano 814 razy\t\t&ndash; 3,94 MB<\/small>\n<\/a>\n\n\n\n<a  data-e-Disable-Page-Transition=\"true\" class=\"download-link download-button aligncenter\" title=\"Wersja v1.0\" href=\"https:\/\/daniel.slask.pl\/m\/download\/572\/?tmstv=1788161164\" rel=\"nofollow\" id=\"download-link-572\" >\n\t<p>\n\t\tPobierz &ldquo;Cs_N04_Baza_danych_SQLite-Ksi\u0105\u017cka_adr1.zip&rdquo;\t<\/p>\n\t<small>Cs_N04_Baza_danych_SQLite-Ksi\u0105\u017cka_adr1.zip\t\t&ndash; Pobrano 854 razy\t\t&ndash; 3,96 MB<\/small>\n<\/a>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>P.S.<br>Podobny wpis zosta\u0142 r\u00f3wnie\u017c umieszczony przeze mnie na forum <a href=\"http:\/\/www.microgeek.eu\">microgeek<\/a> \u2013 zach\u0119cam do rejestracji i cz\u0119stych wizyt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Witam. Pewnie ka\u017cdy pocz\u0105tkuj\u0105cy programista zastanawia\u0142 si\u0119 jak i gdzie zapisa\u0107 du\u017co danych i w \u0142atwy spos\u00f3b mie\u0107 do nich dost\u0119p. Mo\u017cliwe jest wykorzystanie plik\u00f3w tekstowych, lecz dost\u0119p do danych jest do\u015b\u0107 utrudniony. Mo\u017cna wykorzysta\u0107 r\u00f3wnie\u017c pliki XML (z ang&#8230;.<br \/><a class=\"read-more-button\" href=\"https:\/\/daniel.slask.pl\/m\/visual-studio-2015-obsluga-lokalnej-bazy-danych-przy-uzyciu-sqlite-jezykiem-poczatkujacego\/\">Wi\u0119cej<\/a><\/p>\n","protected":false},"author":1,"featured_media":558,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,59],"tags":[86,87,33,65,84,85,66],"views":16402,"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/05\/SQLite_Logo_4.png","jetpack_shortlink":"https:\/\/wp.me\/pcPgV3-8T","_links":{"self":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/551"}],"collection":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/comments?post=551"}],"version-history":[{"count":13,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/551\/revisions"}],"predecessor-version":[{"id":1638,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/551\/revisions\/1638"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media\/558"}],"wp:attachment":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media?parent=551"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/categories?post=551"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/tags?post=551"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}