Sign in Join
Wiki copytemporary

SQLite/pl: what changed

Revision 3 to 4. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1+---
2+[[Portal:Databases|**Portal bazy danych**]]
3+Bibliografia: · [[Databases|Informacje ogólne]] · [[Database libraries|Biblioteki]] · [[Database field type|Typy pól]] · [[Data Controls tab|Kontrolki]] · [[Lazarus DB Faq|FAQ]] · [[SqlDBHowto|SQL-instrukcje]] · [[Working With TSQLQuery|Praca z TSQLQuery]] · [[How to write in-memory database applications in Lazarus/FPC|Aplikacje bazodanowe w pamięci]] · Poradniki/porady praktyczne: · [[Lazarus Database Overview|Przegląd]] · [[SQLdb Tutorial0|0 - Konfiguracja bazy danych]] · [[SQLdb Tutorial1|1 - Rozpoczęcie pracy]] · [[SQLdb Tutorial2|2 - Edycja]] · [[SQLdb Tutorial3|3 - Zapytania]] · [[SQLdb Tutorial4|4 - Moduły danych]] · [[SQLdb Programming Reference|Informacje o programowaniu]] · Bazy danych · [[Advantage Database Server|Advantage]] \- [[MySQLDatabases/pl|MySQL]] \- [[mssqlconn/pl|MS SQL]] \- [[postgres|Postgres]] \- [[Firebird|Interbase]] \- [[Firebird]] \- [[Oracle]] \- [[ODBCConn|ODBC]] \- [[TParadox|Paradox]] \- SQLite \- [[Lazarus Tdbf Tutorial|dBASE]] \- [[MS Access]] \- [[Zeos tutorial|Zeos]]
4+
5+
16## Obsługa SQLite i FPC/Lazarus
27
3-SQLite to wbudowana (nie serwerowa) baza danych dla jednego użytkownika, która może być używana w aplikacjach FPC i Lazarus. Aby uzyskać dostęp do SQLite z programów FPC/Lazarus, można użyć różnych sterowników. Wszystkie sterowniki do poprawnej pracy potrzebują biblioteki/dll SQLite umieszczonej w katalogu wykonywalnym (którym może być katalog projektu lub np. (katalog projektu)/lib/architecture/ w zależności od ustawień projektu Lazarus) (i dystrybuowane z plikiem wykonywalnym).
8+SQLite to wbudowana (nie serwerowa) baza danych dla jednego użytkownika, która może być używana w aplikacjach FPC i Lazarus. Aby uzyskać dostęp do SQLite z programów FPC/Lazarus, można użyć różnych sterowników. Wszystkie sterowniki do poprawnej pracy potrzebują biblioteki/dll SQLite umieszczonej w katalogu wykonywalnym (którym może być katalog projektu lub np. (katalog projektu)/lib/architecture/ w zależności od ustawień projektu Lazarus) (i dystrybuowane z plikiem wykonywalnym).
49
5-Biblioteka ta może być również umieszona w twoim katalogu Lazarus IDE. Zobacz [1](https://forum.lazarus.freepascal.org/index.php?topic=46118.msg327940#msg327940) oraz czytaj dalej, szczególnie dla Zobacz poniżej
10+Biblioteka ta może być również umieszona w twoim katalogu Lazarus IDE. Zobacz [[1]](<https://forum.lazarus.freepascal.org/index.php?topic=46118.msg327940#msg327940>) oraz czytaj dalej, szczególnie dla Zobacz poniżej
611
7-Większość dystrybucji Linuksa ma domyślnie zainstalowany sqlite3 (np. libsqlite3.so.0), ale dystrybucje Ubuntu wymagają również odpowiedniego pakietu Dev. Oba powinny zostać zainstalowane za pośrednictwem menedżera pakietów systemowych i oznaczone jako zależność, a nie dystrybuowane z aplikacją.
12+Większość dystrybucji Linuksa ma domyślnie zainstalowany sqlite3 (np. libsqlite3.so.0), ale dystrybucje Ubuntu wymagają również odpowiedniego pakietu Dev. Oba powinny zostać zainstalowane za pośrednictwem menedżera pakietów systemowych i oznaczone jako zależność, a nie dystrybuowane z aplikacją.
813
9-Win64: zobacz [[Windows Programming Tips|to]] ostrzeżenie o nieużywaniu niektórych wersji FPC/Lazarus Win64.
14+Win64: zobacz [[Windows Programming Tips|to]] ostrzeżenie o nieużywaniu niektórych wersji FPC/Lazarus Win64.
1015
1116### Bezpośredni dostęp do SQLite
1217
13-Możesz w prosty sposób połączyć SQLite z Lazarusem. Komponenty, które nazywasz LiteDAC. SQLite Data Access Components (LiteDAC) to biblioteka komponentów, która zapewnia natywną łączność z SQLite z Lazarus (i Free Pascal) w systemach Windows, macOS, iOS, Android, Linux i FreeBSD dla platform 32-bitowych i 64-bitowych. LiteDAC jest przeznaczony dla programistów do tworzenia prawdziwie wieloplatformowych aplikacji bazodanowych SQLite na komputery stacjonarne i mobilne bez konieczności wdrażania dodatkowych bibliotek. Wersję próbną tego komercyjnego produktu można pobrać na stronie [Komponenty Lazarusa](https://www.devart(dot)com/litedac/download.html). Uwaga, w linku zamień wyrażenie (dot) na kropkę.
18+Możesz w prosty sposób połączyć SQLite z Lazarusem. Komponenty, które nazywasz LiteDAC. SQLite Data Access Components (LiteDAC) to biblioteka komponentów, która zapewnia natywną łączność z SQLite z Lazarus (i Free Pascal) w systemach Windows, macOS, iOS, Android, Linux i FreeBSD dla platform 32-bitowych i 64-bitowych. LiteDAC jest przeznaczony dla programistów do tworzenia prawdziwie wieloplatformowych aplikacji bazodanowych SQLite na komputery stacjonarne i mobilne bez konieczności wdrażania dodatkowych bibliotek. Wersję próbną tego komercyjnego produktu można pobrać na stronie [Komponenty Lazarusa](<https://www.devart\(dot\)com/litedac/download.html>). Uwaga, w linku zamień wyrażenie (dot) na kropkę.
1419
1520### Wbudowane komponenty SQLDB
1621
17-FPC/Lazarus oferuje wbudowane komponenty SQLDB, które obejmują obsługę baz danych SQLite ([[TSQLite3Connection]]) na zakładce [[SQLdb]] [[Component Palette|Palety Komponentów]], które pozwalają m.in. tworzyć GUI z komponentami bazy danych, takimi jak TDBGrids. Zaletą korzystania z komponentów baz danych SQLDB jest to, że dość łatwo jest przejść do innej bazy danych, takiej jak Firebird lub PostgreSQL, bez zbytniego zmieniania programu. Zobacz poniżej szczegóły.
22+FPC/Lazarus oferuje wbudowane komponenty SQLDB, które obejmują obsługę baz danych SQLite ([[TSQLite3Connection]]) na zakładce [[SQLdb]] [[Component Palette|Palety Komponentów]], które pozwalają m.in. tworzyć GUI z komponentami bazy danych, takimi jak TDBGrids. Zaletą korzystania z komponentów baz danych SQLDB jest to, że dość łatwo jest przejść do innej bazy danych, takiej jak Firebird lub PostgreSQL, bez zbytniego zmieniania programu. Zobacz poniżej szczegóły.
1823
1924#### Wsparcie dla Spatialite
2025
21-Spatialite to rozszerzenia GIS do SQLite, których można używać z poziomu bazy danych SQL. Zobacz [[Spatialite]].
26+Spatialite to rozszerzenia GIS do SQLite, których można używać z poziomu bazy danych SQL. Zobacz [[Spatialite]].
2227
2328#### Obsługa szyfrowania w SQLite
2429
25-W ostatnich wersjach FPC (wdrożonych w marcu 2012 r.) SQLDB zawierał obsługę niektórych rozszerzonych wersji SQLite3, które szyfrują plik bazy danych SQLite przy użyciu algorytmu AES. Użyj właściwości hasła, aby ustawić klucz szyfrowania.
30+W ostatnich wersjach FPC (wdrożonych w marcu 2012 r.) SQLDB zawierał obsługę niektórych rozszerzonych wersji SQLite3, które szyfrują plik bazy danych SQLite przy użyciu algorytmu AES. Użyj właściwości hasła, aby ustawić klucz szyfrowania.
2631
27-Przykłady:
32+Przykłady:
2833
29-- [SQLCipher](http://sqlcipher.net/): open source, lecz nie darmowe, dostępne są m.in. pliki binarne Windows (jednak musisz je skompilować samodzielnie)
30-- [System.Data.SQLite](http://system.data.sqlite.org/): open source, dostępne są binaria Windows (32, 64, CE), pobierz np. jeden z prekompilowanych plików binarnych i zmień nazwę SQLite.Interop.dll na sqlite3.dll (jeśli używasz statycznie dołączanych bibliotek, prawdopodobnie musisz zmienić nazwę System.Data.SQLite.DLL na sqlite3.dll)
31-- [wxSQLite3](http://wxcode.sourceforge.net/docs/wxsqlite3/): open source
32-- [sqleet](https://github.com/resilar/sqleet): open source, brak zależności od innych bibliotek, łatwo kompiluje się za pomocą GCC do plików wykonywalnych i pliki bibliotek, wieloplatformowy. Mechanizmy szyfrowania są dostępne zarówno interaktywnie, jak i poprzez sqleet API.
34+ * [SQLCipher](<http://sqlcipher.net/>): open source, lecz nie darmowe, dostępne są m.in. pliki binarne Windows (jednak musisz je skompilować samodzielnie)
35+ * [System.Data.SQLite](<http://system.data.sqlite.org/>): open source, dostępne są binaria Windows (32, 64, CE), pobierz np. jeden z prekompilowanych plików binarnych i zmień nazwę SQLite.Interop.dll na sqlite3.dll (jeśli używasz statycznie dołączanych bibliotek, prawdopodobnie musisz zmienić nazwę System.Data.SQLite.DLL na sqlite3.dll)
36+ * [wxSQLite3](<http://wxcode.sourceforge.net/docs/wxsqlite3/>): open source
37+ * [sqleet](<https://github.com/resilar/sqleet>): open source, brak zależności od innych bibliotek, łatwo kompiluje się za pomocą GCC do plików wykonywalnych i pliki bibliotek, wieloplatformowy. Mechanizmy szyfrowania są dostępne zarówno interaktywnie, jak i poprzez sqleet API.
3338
3439#### sqlite3backup
3540
36-sqlite3backup to jest moduł dostarczany z FPC (nie z Lazarus, ale może być w nim używany programowo), który zapewnia funkcje tworzenia kopii zapasowych/przywracania dla SQLite3. Wykorzystuje sqlite3conn bazy danych SQLDB.
41+sqlite3backup to jest moduł dostarczany z FPC (nie z Lazarus, ale może być w nim używany programowo), który zapewnia funkcje tworzenia kopii zapasowych/przywracania dla SQLite3. Wykorzystuje sqlite3conn bazy danych SQLDB.
3742
3843### Zeos
3944
40-[Zeos](https://sourceforge.net/projects/zeoslib/)
45+[Zeos](<https://sourceforge.net/projects/zeoslib/>)
4146
4247### SQLitePass
4348
44-Komponenty [SQLitePass](http://source.online.free.fr/). Ostatnia aktualizacja kodu w 2010. Ostatnia aktywność na forum w 2011.
49+Komponenty [SQLitePass](<http://source.online.free.fr/>). Ostatnia aktualizacja kodu w 2010. Ostatnia aktywność na forum w 2011.
4550
4651### TSQLite3Dataset i TSQLiteDataset
4752
48-Istnieją również oddzielne pakiety TSQLiteDataset (moduł sqliteds) i TSQLite3Dataset (moduł sqlite3ds); poniżej znajdziesz opis, jak z nich korzystać. Odwiedź [stronę główną sqlite4fpc](http://sqlite4fpc.yolasite.com/), aby znaleźć informacje o interfejsie API i więcej samouczków.
53+Istnieją również oddzielne pakiety TSQLiteDataset (moduł sqliteds) i TSQLite3Dataset (moduł sqlite3ds); poniżej znajdziesz opis, jak z nich korzystać. Odwiedź [stronę główną sqlite4fpc](<http://sqlite4fpc.yolasite.com/>), aby znaleźć informacje o interfejsie API i więcej samouczków.
4954
50-TSqliteDataset i TSqlite3Dataset są potomkami [[TDataSet/pl|TDataSet]], które uzyskują dostęp odpowiednio do baz danych sqlite 2.8.x i 3.x.x. W przypadku nowych projektów prawdopodobnie użyjesz TSQlite3Dataset, ponieważ SQLite 3.x jest aktualną wersją.
55+TSqliteDataset i TSqlite3Dataset są potomkami [[TDataSet/pl|TDataSet]], które uzyskują dostęp odpowiednio do baz danych sqlite 2.8.x i 3.x.x. W przypadku nowych projektów prawdopodobnie użyjesz TSQlite3Dataset, ponieważ SQLite 3.x jest aktualną wersją.
5156
52-Poniżej znajduje się lista głównych zalet i wad w porównaniu z innymi sterownikami/metodami dostępu FPC/Lazarus SQLite:
57+Poniżej znajduje się lista głównych zalet i wad w porównaniu z innymi sterownikami/metodami dostępu FPC/Lazarus SQLite:
5358
54-Zalety:
59+Zalety:
5560
56-- Elastyczny: programiści mogą wybrać, czy chcą używać języka SQL, czy nie, co pozwala im pracować z prostymi układami tabel lub dowolnym złożonym układem, na który pozwala SQL/sqlite
61+ * Elastyczny: programiści mogą wybrać, czy chcą używać języka SQL, czy nie, co pozwala im pracować z prostymi układami tabel lub dowolnym złożonym układem, na który pozwala SQL/sqlite
5762
58-Wady:
63+Wady:
5964
60-- Zmiana na inne bazy danych jest trudniejsza niż w przypadku korzystania z komponentów SQLDB lub Zeos
65+ * Zmiana na inne bazy danych jest trudniejsza niż w przypadku korzystania z komponentów SQLDB lub Zeos
6166
62-> **Note:** Biorąc pod uwagę powyższe, wielu użytkowników będzie używać SQLDB lub Zeos ze względu na zalety, chyba że potrzebują dostępu niższego poziomu do biblioteki SQLite
67+![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Uwaga:** Biorąc pod uwagę powyższe, wielu użytkowników będzie używać SQLDB lub Zeos ze względu na zalety, chyba że potrzebują dostępu niższego poziomu do biblioteki SQLite
6368
6469## Używanie komponentów SQLdb z SQLite
6570
66-Te instrukcje koncentrują się na specyfice SQLDB (TSQLite3Connection) dla SQLite. Aby uzyskać ogólny przegląd, spójrz na [[SqlDBHowto]], który zawiera przydatne informacje o komponentach SQLdb.
67-
68-Zobacz [[SQLdb Tutorial1]], aby zapoznać się z samouczkiem na temat tworzenia GUI programu obsługującego bazę danych, który jest napisany dla SQLite/SQLDB (jak również dla Firebird/SQLDB, PostgreSQL/SQLDB, w zasadzie wszystkich obsługiwanych przez RDBMS SQLDB).
71+Te instrukcje koncentrują się na specyfice SQLDB (TSQLite3Connection) dla SQLite. Aby uzyskać ogólny przegląd, spójrz na [[SqlDBHowto]], który zawiera przydatne informacje o komponentach SQLdb.
6972
70-Wykorzystamy kombinację trzech komponentów z zakładki Lazarus SQLdb: TSQLite3Connection, TSQLTransaction oraz TSQLQuery. TSQLQuery działa jak nasz TDataSet; w najprostszym przypadku reprezentuje po prostu jedną z naszych tabel. Dla uproszczenia: upewnij się, że masz już istniejący plik bazy danych SQLite i nie musisz teraz tworzyć nowego. TSQLite3Connection można znaleźć w module *sqlite3conn*, ktory pownieneś zadeklarować samodzielnie jeśli pracujesz we FreePascalu.
73+Zobacz [[SQLdb Tutorial1]], aby zapoznać się z samouczkiem na temat tworzenia GUI programu obsługującego bazę danych, który jest napisany dla SQLite/SQLDB (jak również dla Firebird/SQLDB, PostgreSQL/SQLDB, w zasadzie wszystkich obsługiwanych przez RDBMS SQLDB).
7174
72-Te trzy komponenty łączy się ze sobą zwykle tak: W TSQLQuery ustaw właściwości Database i Transaction, a w TSQLTransaction ustaw właściwość Database. Nie ma wiele do zrobienia w komponentach Transaction i Connection, większość interesujących rzeczy zostanie zrobione w TSQLQuery. Skonfiguruj komponenty w następujący sposób:
75+Wykorzystamy kombinację trzech komponentów z zakładki Lazarus SQLdb: TSQLite3Connection, TSQLTransaction oraz TSQLQuery. TSQLQuery działa jak nasz TDataSet; w najprostszym przypadku reprezentuje po prostu jedną z naszych tabel. Dla uproszczenia: upewnij się, że masz już istniejący plik bazy danych SQLite i nie musisz teraz tworzyć nowego. TSQLite3Connection można znaleźć w module _sqlite3conn_ , ktory pownieneś zadeklarować samodzielnie jeśli pracujesz we FreePascalu.
7376
74-TSQLite3Connection:
77+Te trzy komponenty łączy się ze sobą zwykle tak: W TSQLQuery ustaw właściwości Database i Transaction, a w TSQLTransaction ustaw właściwość Database. Nie ma wiele do zrobienia w komponentach Transaction i Connection, większość interesujących rzeczy zostanie zrobione w TSQLQuery. Skonfiguruj komponenty w następujący sposób:
7578
76-- DatabaseName: Ustaw tę właściwość na nazwę pliku (ścieżkę bezwzględną!) swojego pliku SQLite. Niestety, nie można po prostu użyć ścieżki względnej, która działa bez zmian w czasie projektowania i w czasie wykonywania ***czy to nadal prawda? Czy nie można po prostu skopiować plik db w skrypcie powłoki po kompilacji lub połączyć go symbolicznie?***. Należy upewnić się, że podczas uruchamiania aplikacji poprawna ścieżka do pliku jest zawsze ustawiana programowo, bez względu na to, co zawierała w czasie projektowania.
79+TSQLite3Connection:
7780
78-Uwaga: Aby ustawić pełną ścieżkę biblioteki (jeśli umieścisz swoją bibliotekę sqlite dll/so/dylib w miejscu, w którym system operacyjny go nie znajdzie, na przykład w katalogu aplikacji w systemie Linux/OSX), możesz ustawić właściwość *SQLiteLibraryName* (PRZED nawiązaniem jakiegokolwiek połączenia, np. w zdarzeniu OnCreate formularza głównego), np.:
81+ * DatabaseName: Ustaw tę właściwość na nazwę pliku (ścieżkę bezwzględną!) swojego pliku SQLite. Niestety, nie można po prostu użyć ścieżki względnej, która działa bez zmian w czasie projektowania i w czasie wykonywania ***czy to nadal prawda? Czy nie można po prostu skopiować plik db w skrypcie powłoki po kompilacji lub połączyć go symbolicznie?***. Należy upewnić się, że podczas uruchamiania aplikacji poprawna ścieżka do pliku jest zawsze ustawiana programowo, bez względu na to, co zawierała w czasie projektowania.
7982
80-``` pascal
83+Uwaga: Aby ustawić pełną ścieżkę biblioteki (jeśli umieścisz swoją bibliotekę sqlite dll/so/dylib w miejscu, w którym system operacyjny go nie znajdzie, na przykład w katalogu aplikacji w systemie Linux/OSX), możesz ustawić właściwość _SQLiteLibraryName_ (PRZED nawiązaniem jakiegokolwiek połączenia, np. w zdarzeniu OnCreate formularza głównego), np.:
84+```
8185SQLiteLibraryName:='./sqlite3.so';
8286```
8387
84-TSQLQuery:
88+TSQLQuery:
8589
86-- SQL: Ustaw ją na proste zapytanie wybierające dane z jednej ze swoich tabel. Na przykład, jeśli masz tabelę „foo” i chcesz, aby ten zbiór danych reprezentował tę tabelę, użyj po prostu:
87- ``` SQL
88- SELECT * FROM foo
89- ```
90+ * SQL: Ustaw ją na proste zapytanie wybierające dane z jednej ze swoich tabel. Na przykład, jeśli masz tabelę „foo” i chcesz, aby ten zbiór danych reprezentował tę tabelę, użyj po prostu:
91+```
92+SELECT * FROM foo
93+```
9094
91-- Active: Ustaw to na True z poziomu IDE, aby sprawdzić, czy wszystko jest poprawnie skonfigurowane. Spowoduje to również automatyczne aktywowanie transakcji i obiektów połączenia. Jeśli pojawi się błąd, oznacza to, że nazwa bazy danych połączenia jest niepoprawna lub zapytanie SQL jest nieprawidłowe. Później, gdy zakończymy dodawanie pól (patrz poniżej), ustaw je ponownie jako nieaktywne, nie chcemy, aby IDE blokowało bazę danych SQLite (pojedynczy użytkownik!) podczas testowania aplikacji.
95+ * Active: Ustaw to na True z poziomu IDE, aby sprawdzić, czy wszystko jest poprawnie skonfigurowane. Spowoduje to również automatyczne aktywowanie transakcji i obiektów połączenia. Jeśli pojawi się błąd, oznacza to, że nazwa bazy danych połączenia jest niepoprawna lub zapytanie SQL jest nieprawidłowe. Później, gdy zakończymy dodawanie pól (patrz poniżej), ustaw je ponownie jako nieaktywne, nie chcemy, aby IDE blokowało bazę danych SQLite (pojedynczy użytkownik!) podczas testowania aplikacji.
9296
93-- *Prawdopodobnie nie jest to konieczne do poprawnego działania - będzie wymagało sprawdzenia (czerwiec 2012)* Teraz możemy dodać Pola do naszego TSQLQuery. Podczas gdy komponenty są nadal aktywne, kliknij prawym przyciskiem myszy i „edytuj pola...”. Kliknij przycisk „+” i dodaj pola. Wyświetli się lista wszystkich pól zwróconych przez Twoje zapytanie SQL. Dodaj wszystkie potrzebne pola, możesz również dodać tutaj pola wyszukiwania; w takim przypadku po prostu upewnij się, że zdefiniowałeś już wszystkie potrzebne pola w innych zestawach danych, zanim zaczniesz dodawać pola odnośników, które się do nich odwołują. Jeśli Twoja tabela ma wiele kolumn i nie potrzebujesz ich wszystkich, możesz je po prostu pominąć, możesz również nieco bardziej uszczegółowić swój kod SQL.
97+ * _Prawdopodobnie nie jest to konieczne do poprawnego działania - będzie wymagało sprawdzenia (czerwiec 2012)_ Teraz możemy dodać Pola do naszego TSQLQuery. Podczas gdy komponenty są nadal aktywne, kliknij prawym przyciskiem myszy i „edytuj pola...”. Kliknij przycisk „+” i dodaj pola. Wyświetli się lista wszystkich pól zwróconych przez Twoje zapytanie SQL. Dodaj wszystkie potrzebne pola, możesz również dodać tutaj pola wyszukiwania; w takim przypadku po prostu upewnij się, że zdefiniowałeś już wszystkie potrzebne pola w innych zestawach danych, zanim zaczniesz dodawać pola odnośników, które się do nich odwołują. Jeśli Twoja tabela ma wiele kolumn i nie potrzebujesz ich wszystkich, możesz je po prostu pominąć, możesz również nieco bardziej uszczegółowić swój kod SQL.
9498
95-- W swoim kodzie musisz wywołać zdarzenia SQLQuery.ApplyUpdates i SQLTransaction.Commit, TSQLQuery.AfterPost i AfterInsert, które są do tego dobrym miejscem, gdy używasz go z kontrolkami obsługującymi dane, ale oczywiście możesz również odłożyć te wywołania na później. Jeśli te wywołania nie zostaną wykonane, baza danych nie zostanie zaktualizowana.
99+ * W swoim kodzie musisz wywołać zdarzenia SQLQuery.ApplyUpdates i SQLTransaction.Commit, TSQLQuery.AfterPost i AfterInsert, które są do tego dobrym miejscem, gdy używasz go z kontrolkami obsługującymi dane, ale oczywiście możesz również odłożyć te wywołania na później. Jeśli te wywołania nie zostaną wykonane, baza danych nie zostanie zaktualizowana.
96100
97-- „Baza danych jest zablokowana”: IDE może nadal blokować bazę danych (SQLite jest bazą danych jednego użytkownika), prawdopodobnie zapomniałeś ustawić komponenty jako nieaktywne i ponownie rozłączone po zakończeniu definiowania wszystkich pól obiektów TSQLQuery. Użyj zdarzenia OnCreate formularza, aby ustawić ścieżkę i aktywować obiekty tylko w czasie wykonywania. Większość rzeczy ustawianych w TSQLQuery z poziomu IDE nie wymaga (a niektóre nawet nie pozwalają) by były aktywne w czasie projektowania, jedynym wyjątkiem jest zdefiniowanie pól, z których chce się odczytać projekt tabeli, więc w czasie projektowania stan nieaktywny powinien być normalnym stanem.
101+ * „Baza danych jest zablokowana”: IDE może nadal blokować bazę danych (SQLite jest bazą danych jednego użytkownika), prawdopodobnie zapomniałeś ustawić komponenty jako nieaktywne i ponownie rozłączone po zakończeniu definiowania wszystkich pól obiektów TSQLQuery. Użyj zdarzenia OnCreate formularza, aby ustawić ścieżkę i aktywować obiekty tylko w czasie wykonywania. Większość rzeczy ustawianych w TSQLQuery z poziomu IDE nie wymaga (a niektóre nawet nie pozwalają) by były aktywne w czasie projektowania, jedynym wyjątkiem jest zdefiniowanie pól, z których chce się odczytać projekt tabeli, więc w czasie projektowania stan nieaktywny powinien być normalnym stanem.
98102
99-- Wszystkie Twoje tabele powinny mieć klucz podstawowy i musisz upewnić się, że odpowiednie pole ma pfInKey i nic więcej w swoich PoviderFlags (te flagi kontrolują, jak i gdzie pole jest używane podczas automatycznego tworzenia zapytań aktualizujących i usuwających).
103+ * Wszystkie Twoje tabele powinny mieć klucz podstawowy i musisz upewnić się, że odpowiednie pole ma pfInKey i nic więcej w swoich PoviderFlags (te flagi kontrolują, jak i gdzie pole jest używane podczas automatycznego tworzenia zapytań aktualizujących i usuwających).
100104
101-- Jeśli używasz pól wyszukiwania
102- - upewnij się, że ProviderFlags dla pola wyszukiwania jest całkowicie pusty, aby nie próbowało użyć swojej nazwy w zapytaniu aktualizującym. Samo pole odnośnika nie jest polem danych, działa tylko na wartość innego pola, odpowiadającego pola klucza i tylko to pole klucza będzie później używane w zapytaniach aktualizujących. Możesz ustawić pole klucza na ukryte, ponieważ zwykle nie chcesz go widzieć w swoim DBGrid, ale należy je zdefiniować.
103- - LookupCache musi być ustawiony na True. W chwili pisania tego tekstu z jakiegoś powodu pole odnośnika nie wyświetli nic innego (ale nadal będzie działać) i dziwnie dokładnie odwrotnie jest w przypadku pracy z TSQLite3Dataset lub innymi komponentami TXXXDataset, tutaj musi być ustawione na False. Nie jestem jeszcze pewien, czy jest to zamierzone zachowanie, czy błąd.
105+ * Jeśli używasz pól wyszukiwania
106+ * upewnij się, że ProviderFlags dla pola wyszukiwania jest całkowicie pusty, aby nie próbowało użyć swojej nazwy w zapytaniu aktualizującym. Samo pole odnośnika nie jest polem danych, działa tylko na wartość innego pola, odpowiadającego pola klucza i tylko to pole klucza będzie później używane w zapytaniach aktualizujących. Możesz ustawić pole klucza na ukryte, ponieważ zwykle nie chcesz go widzieć w swoim DBGrid, ale należy je zdefiniować.
107+ * LookupCache musi być ustawiony na True. W chwili pisania tego tekstu z jakiegoś powodu pole odnośnika nie wyświetli nic innego (ale nadal będzie działać) i dziwnie dokładnie odwrotnie jest w przypadku pracy z TSQLite3Dataset lub innymi komponentami TXXXDataset, tutaj musi być ustawione na False. Nie jestem jeszcze pewien, czy jest to zamierzone zachowanie, czy błąd.
104108
105-- Zwykle w przypadku prostych tabel nie musisz ustawiać żadnych właściwości InsertSQL, UpdateSQL i DeleteSQL, po prostu zostaw je puste. Jeśli masz ustawione poprawnie flagi dostawcy wszystkich pól, to powinno być w stanie utworzyć potrzebny kod SQL w locie. Aby uzyskać więcej informacji na temat InsertSQL, UpdateSQL i DeleteSQL, zobacz [[Working With TSQLQuery|Working_With_TSQLQuery#InsertSQL.2C_UpdateSQL_and_DeleteSQL_-_Basic_use_of_parameters]].
109+ * Zwykle w przypadku prostych tabel nie musisz ustawiać żadnych właściwości InsertSQL, UpdateSQL i DeleteSQL, po prostu zostaw je puste. Jeśli masz ustawione poprawnie flagi dostawcy wszystkich pól, to powinno być w stanie utworzyć potrzebny kod SQL w locie. Aby uzyskać więcej informacji na temat InsertSQL, UpdateSQL i DeleteSQL, zobacz [[Working With TSQLQuery|Working_With_TSQLQuery#InsertSQL.2C_UpdateSQL_and_DeleteSQL_-_Basic_use_of_parameters]].
106110
107-Po poprawnym skonfigurowaniu powyższego, powinieneś być teraz w stanie używać TSQLQuery jak każdego innego zestawu TDataset, manipulując jego danymi programowo lub umieszczając TDatasouce w formularzu, łącząc go z TSQLQuery, a następnie używając kontroli danych, takich jak TDBGrid itp.
111+Po poprawnym skonfigurowaniu powyższego, powinieneś być teraz w stanie używać TSQLQuery jak każdego innego zestawu TDataset, manipulując jego danymi programowo lub umieszczając TDatasouce w formularzu, łącząc go z TSQLQuery, a następnie używając kontroli danych, takich jak TDBGrid itp.
108112
109113### Tworzenie bazy danych
110114
111-Metoda [TSQLite3Connection.CreateDB](http://www.freepascal.org/docs-html/fcl/sqldb/tsqlconnection.createdb.html) odziedziczona z klasy nadrzędnej w rzeczywistości nic nie robi; aby utworzyć bazę danych, jeśli jeszcze nie istnieje plik bazy, wystarczy zapisać dane tabeli, jak w poniższym przykładzie:
112-
113-(Kod wyodrębniony z przykładu sqlite_encryption_pragma, który jest dostarczany z Lazarus 1.3 i nowszymi)
115+Metoda [TSQLite3Connection.CreateDB](<http://www.freepascal.org/docs-html/fcl/sqldb/tsqlconnection.createdb.html>) odziedziczona z klasy nadrzędnej w rzeczywistości nic nie robi; aby utworzyć bazę danych, jeśli jeszcze nie istnieje plik bazy, wystarczy zapisać dane tabeli, jak w poniższym przykładzie:
114116
115-``` pascal
117+(Kod wyodrębniony z przykładu sqlite_encryption_pragma, który jest dostarczany z Lazarus 1.3 i nowszymi)
118+```
116119var
117- newFile : Boolean;
118-begin
119-
120- SQLite3Connection1.Close; // Upewnij się, że połączenie jest zamknięte, gdy zaczynamy
121-
122- try
123- // Ponieważ tworzymy tę bazę danych po raz pierwszy,
124- // sprawdź, czy plik już istnieje
125- newFile := not FileExists(SQLite3Connection1.DatabaseName);
126-
127- if newFile then
120+ newFile : Boolean;
128121 begin
129- // Utwórz bazę danych i tabele
122+
123+ SQLite3Connection1.Close; // Upewnij się, że połączenie jest zamknięte, gdy zaczynamy
124+
130125 try
131- SQLite3Connection1.Open;
132- SQLTransaction1.Active := true;
133-
134- // Tutaj konfigurujemy tabelę o nazwie „DATA” w nowej bazie danych
135- SQLite3Connection1.ExecuteDirect('CREATE TABLE "DATA"('+
136- ' "id" Integer NOT NULL PRIMARY KEY AUTOINCREMENT,'+
137- ' "Current_Time" DateTime NOT NULL,'+
138- ' "User_Name" Char(128) NOT NULL,'+
139- ' "Info" Char(128) NOT NULL);');
140-
141- // Tworzenie indeksu na podstawie id w tabeli DATA
142- SQLite3Connection1.ExecuteDirect('CREATE UNIQUE INDEX "Data_id_idx" ON "DATA"( "id" );');
143-
144- SQLTransaction1.Commit;
145-
146- ShowMessage('Pomyślnie utworzono bazę danych.');
126+ // Ponieważ tworzymy tę bazę danych po raz pierwszy,
127+ // sprawdź, czy plik już istnieje
128+ newFile := not FileExists(SQLite3Connection1.DatabaseName);
129+
130+ if newFile then
131+ begin
132+ // Utwórz bazę danych i tabele
133+ try
134+ SQLite3Connection1.Open;
135+ SQLTransaction1.Active := true;
136+
137+ // Tutaj konfigurujemy tabelę o nazwie „DATA” w nowej bazie danych
138+ SQLite3Connection1.ExecuteDirect('CREATE TABLE "DATA"('+
139+ ' "id" Integer NOT NULL PRIMARY KEY AUTOINCREMENT,'+
140+ ' "Current_Time" DateTime NOT NULL,'+
141+ ' "User_Name" Char(128) NOT NULL,'+
142+ ' "Info" Char(128) NOT NULL);');
143+
144+ // Tworzenie indeksu na podstawie id w tabeli DATA
145+ SQLite3Connection1.ExecuteDirect('CREATE UNIQUE INDEX "Data_id_idx" ON "DATA"( "id" );');
146+
147+ SQLTransaction1.Commit;
148+
149+ ShowMessage('Pomyślnie utworzono bazę danych.');
150+ except
151+ ShowMessage('Nie można utworzyć nowej bazy danych');
152+ end;
153+ end;
147154 except
148- ShowMessage('Nie można utworzyć nowej bazy danych');
155+ ShowMessage('Nie można sprawdzić, czy plik bazy danych istnieje');
149156 end;
150- end;
151- except
152- ShowMessage('Nie można sprawdzić, czy plik bazy danych istnieje');
153- end;
154- end;
157+ end;
155158```
156159
157160### Tworzenie zestawień zdefiniowanych przez użytkownika
158-
159-``` pascal
161+```
160162// Funkcja daje wynik porównania z rozróżnianiem wielkości liter w utf8
161-function UTF8xCompare(user: pointer; len1: longint; data1: pointer; len2: longint; data2: pointer): longint; cdecl;
162-var S1, S2: AnsiString;
163-begin
164- SetString(S1, data1, len1);
165- SetString(S2, data2, len2);
166- Result := UnicodeCompareStr(UTF8Decode(S1), UTF8Decode(S2));
167-end;
168-
169-// Funkcja daje wynik porównania bez rozróżniania wielkości liter w utf8
170-function UTF8xCompare_CI(user: pointer; len1: longint; data1: pointer; len2: longint; data2: pointer): longint; cdecl;
171-var S1, S2: AnsiString;
172-begin
173- SetString(S1, data1, len1);
174- SetString(S2, data2, len2);
175- Result := UnicodeCompareText(UTF8Decode(S1), UTF8Decode(S2));
176-end;
177-
178-// zarejestruj porządek sortowania za pomocą SQLite3 API (wymaga modułu sqlite3dyn):
179-sqlite3_create_collation(SQLite3.Handle, 'UTF8_CI', SQLITE_UTF8, nil, @UTF8xCompare_CI);
180-// lub za pomocą metody TSQLite3Connection:
181-CreateCollation('UTF8_CI',1,nil,@UTF8xCompare_CI);
182-
183-// teraz możemy użyć porównania bez rozróżniania wielkości liter w SQL, takich jak:
184-// SELECT * FORM table1 WHERE column1 COLLATE UTF8_CI = 'ą'
185-
186-// ale to nie działa dla operatora LIKE
187-// w celu obsługi również operatora LIKE musimy przeciążyć domyślną funkcję LIKE za pomocą sqlite3_create_function()
188-// http://www.sqlite.org/lang_corefunc.html#like
163+ function UTF8xCompare(user: pointer; len1: longint; data1: pointer; len2: longint; data2: pointer): longint; cdecl;
164+ var S1, S2: AnsiString;
165+ begin
166+ SetString(S1, data1, len1);
167+ SetString(S2, data2, len2);
168+ Result := UnicodeCompareStr(UTF8Decode(S1), UTF8Decode(S2));
169+ end;
170+
171+ // Funkcja daje wynik porównania bez rozróżniania wielkości liter w utf8
172+ function UTF8xCompare_CI(user: pointer; len1: longint; data1: pointer; len2: longint; data2: pointer): longint; cdecl;
173+ var S1, S2: AnsiString;
174+ begin
175+ SetString(S1, data1, len1);
176+ SetString(S2, data2, len2);
177+ Result := UnicodeCompareText(UTF8Decode(S1), UTF8Decode(S2));
178+ end;
179+
180+ // zarejestruj porządek sortowania za pomocą SQLite3 API (wymaga modułu sqlite3dyn):
181+ sqlite3_create_collation(SQLite3.Handle, 'UTF8_CI', SQLITE_UTF8, nil, @UTF8xCompare_CI);
182+ // lub za pomocą metody TSQLite3Connection:
183+ CreateCollation('UTF8_CI',1,nil,@UTF8xCompare_CI);
184+
185+ // teraz możemy użyć porównania bez rozróżniania wielkości liter w SQL, takich jak:
186+ // SELECT * FORM table1 WHERE column1 COLLATE UTF8_CI = 'ą'
187+
188+ // ale to nie działa dla operatora LIKE
189+ // w celu obsługi również operatora LIKE musimy przeciążyć domyślną funkcję LIKE za pomocą sqlite3_create_function()
190+ // http://www.sqlite.org/lang_corefunc.html#like
189191```
190192
191193### Tworzenie funkcji zdefiniowanych przez użytkownika
192-
193-``` pascal
194+```
194195// przykład przeciążenia domyślnej funkcji LOWER() funkcją podaną przez użytkownika
195-// aby uruchomić to demo, musisz dodać moduły 'sqlite3dyn' i 'ctypes' do sekcji uses
196-// i dodać stałą 'SQLITE_DETERMINISTIC' o wartości $800
197-
198-procedure UTF8xLower(ctx: psqlite3_context; N: cint; V: ppsqlite3_value); cdecl;
199-var S: AnsiString;
200-begin
201- SetString(S, sqlite3_value_text(V[0]), sqlite3_value_bytes(V[0]));
202- S := UTF8Encode(AnsiLowerCase(UTF8Decode(S)));
203- sqlite3_result_text(ctx, PAnsiChar(S), Length(S), sqlite3_destructor_type(SQLITE_TRANSIENT));
204-end;
205-
206-// rejestracja funkcji LOWER() przy użyciu SQLite3 API (wymaga modułu sqlite3dyn):
207-sqlite3_create_function(SQLite3.Handle, 'lower', 1, SQLITE_UTF8 or SQLITE_DETERMINISTIC, nil, @UTF8xLower, nil, nil);
196+ // aby uruchomić to demo, musisz dodać moduły 'sqlite3dyn' i 'ctypes' do sekcji uses
197+ // i dodać stałą 'SQLITE_DETERMINISTIC' o wartości $800
198+
199+ procedure UTF8xLower(ctx: psqlite3_context; N: cint; V: ppsqlite3_value); cdecl;
200+ var S: AnsiString;
201+ begin
202+ SetString(S, sqlite3_value_text(V[0]), sqlite3_value_bytes(V[0]));
203+ S := UTF8Encode(AnsiLowerCase(UTF8Decode(S)));
204+ sqlite3_result_text(ctx, PAnsiChar(S), Length(S), sqlite3_destructor_type(SQLITE_TRANSIENT));
205+ end;
206+
207+ // rejestracja funkcji LOWER() przy użyciu SQLite3 API (wymaga modułu sqlite3dyn):
208+ sqlite3_create_function(SQLite3.Handle, 'lower', 1, SQLITE_UTF8 or SQLITE_DETERMINISTIC, nil, @UTF8xLower, nil, nil);
208209```
209210
210211### SQLite3 i daty
211212
212-- SQLite 3 nie przechowuje dat jako specjalnej wartości typu DateTime. Może przechowywać je jako ciągi typu string, liczby typu doubles lub liczby całkowite typu integer - patrz <http://www.sqlite.org/datatype3.html#datetime>.
213-- W ciągach string separatorem daty jest „-”, zgodnie ze standardem SQL/ISO 8601. Tak więc, jeśli wykonasz INSERT za pomocą wbudowanej funkcji DATE, zostanie ona przechowana jako coś w rodzaju „RRRR-MM-DD”.
214-- Odczytywanie wartości DateTime może powodować problemy dla DataSet, jeśli są one przechowywane jako ciągi: kwalifikator .AsDateTime może zatrzymać się na takim „string date”, ale można to obejść, używając czegoś takiego jak `strftime(`*`%d/%m/%Y`*`,recdate) AS sqlite3recdate` w instrukcji SQL SELECT, co wymusza na SQLite3 zwrócenie rekordu daty w określonym formacie. (ciąg formatu %d/%m/%d odpowiada Twojemu regionalnemu formatowi daty, który .AsDateTime zrozumie) **==\> Otwórz zgłoszenie błędu z przykładową aplikacją demonstrującą problem, jeśli taki wystąpi**
215-- Podczas porównywania dat zapisanych jako ciągi (używając na przykład funkcji BETWEEN) pamiętaj, że porównanie będzie zawsze porównaniem ciągu i dlatego będzie zależeć od tego, jak zachowałeś wartość daty.
213+ * SQLite 3 nie przechowuje dat jako specjalnej wartości typu DateTime. Może przechowywać je jako ciągi typu string, liczby typu doubles lub liczby całkowite typu integer - patrz <http://www.sqlite.org/datatype3.html#datetime>.
214+ * W ciągach string separatorem daty jest „-”, zgodnie ze standardem SQL/ISO 8601. Tak więc, jeśli wykonasz INSERT za pomocą wbudowanej funkcji DATE, zostanie ona przechowana jako coś w rodzaju „RRRR-MM-DD”.
215+ * Odczytywanie wartości DateTime może powodować problemy dla DataSet, jeśli są one przechowywane jako ciągi: kwalifikator .AsDateTime może zatrzymać się na takim „string date”, ale można to obejść, używając czegoś takiego jak `strftime(_%d/%m/%Y_ ,recdate) AS sqlite3recdate` w instrukcji SQL SELECT, co wymusza na SQLite3 zwrócenie rekordu daty w określonym formacie. (ciąg formatu %d/%m/%d odpowiada Twojemu regionalnemu formatowi daty, który .AsDateTime zrozumie) **== > Otwórz zgłoszenie błędu z przykładową aplikacją demonstrującą problem, jeśli taki wystąpi**
216+ * Podczas porównywania dat zapisanych jako ciągi (używając na przykład funkcji BETWEEN) pamiętaj, że porównanie będzie zawsze porównaniem **ciągu** i dlatego będzie zależeć od tego, jak zachowałeś wartość daty.
216217
217218#### Wartości domyślne w czasie lokalnym zamiast UTC
218219
219-CURRENT_TIME, CURRENT_DATE i CURRENT_TIMESTAMP zwracają aktualną datę i/lub czas UTC. Dla lokalnej daty i/lub czasu możemy użyć:
220-
221-```text
222- DEFAULT (datetime('now','localtime')) dla sformatowanych wartości daty i godziny YYYY-MM-DD HH:MM:SS
223- DEFAULT (date('now','localtime')) dla sformatowanej wartości daty YYYY-MM-DD
224- DEFAULT (time('now','localtime')) dla sformatowanej wartości czasu HH:MM:SS
220+CURRENT_TIME, CURRENT_DATE i CURRENT_TIMESTAMP zwracają aktualną datę i/lub czas UTC. Dla lokalnej daty i/lub czasu możemy użyć:
225221```
222+DEFAULT (datetime('now','localtime')) dla sformatowanych wartości daty i godziny YYYY-MM-DD HH:MM:SS
223+ DEFAULT (date('now','localtime')) dla sformatowanej wartości daty YYYY-MM-DD
224+ DEFAULT (time('now','localtime')) dla sformatowanej wartości czasu HH:MM:SS
225+```
226226
227227### Rozwiązywanie problemów z SQLDB i SQLite
228228
229-- Należy pamiętać, że aby wsparcie w czasie projektowania (pola itp.) mogło działać, Lazarus musi również znaleźć plik sqlite3.dll.
230-- To samo dotyczy nazwy pliku bazy danych. Zawsze używaj ścieżki bezwzględnej, jeśli używasz komponentów do wyodrębniania m.in. nazwy pól w czasie projektowania. W przeciwnym razie IDE utworzy pusty plik w swoim katalogu. W razie problemów sprawdź, czy w katalogu lazarus/ nie ma pustej kopii pliku bazy danych.
231-- Jeśli masz relację master/detail, musisz odświeżyć główny zestaw danych po każdym wstawieniu, aby uzyskać wartość pola klucza obcego podrzędnego zestawu danych. Możesz to zrobić w zdarzeniu AfterPost głównego zestawu danych, wywołując jedną z następujących przeciążonych procedur:
229+ * Należy pamiętać, że aby wsparcie w czasie projektowania (pola itp.) mogło działać, Lazarus musi również znaleźć plik sqlite3.dll.
230+ * To samo dotyczy nazwy pliku bazy danych. Zawsze używaj ścieżki bezwzględnej, jeśli używasz komponentów do wyodrębniania m.in. nazwy pól w czasie projektowania. W przeciwnym razie IDE utworzy pusty plik w swoim katalogu. W razie problemów sprawdź, czy w katalogu lazarus/ nie ma pustej kopii pliku bazy danych.
231+ * Jeśli masz relację master/detail, musisz odświeżyć główny zestaw danych po każdym wstawieniu, aby uzyskać wartość pola klucza obcego podrzędnego zestawu danych. Możesz to zrobić w zdarzeniu AfterPost głównego zestawu danych, wywołując jedną z następujących przeciążonych procedur:
232232
233-``` pascal
233+```
234234interface
235- procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery);overload;
236- procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery; pKeyField: string);overload;
237-
238-implementation
239-
240-procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery; pKeyField: string);
241-//Ta procedura odświeża DataSet i ustawia kursor na ostatnim rekordzie
242-//Do użycia, jeśli nie ma gwarancji, że DataSet zostanie posortowany według klucza podstawowego z automatycznym przyrostem
243-var
244- vLastID: Integer;
245- vUpdateStatus : TUpdateStatus;
246-begin
247- vUpdateStatus := pDataset.UpdateStatus;
248- //Pobierz ostatnio wstawiony identyfikator w bazie danych
249- pDataset.ApplyUpdates;
250- vLastID:=(pDataSet.DataBase as TSQLite3Connection).GetInsertID;
251- //Teraz wróć do odpowiedniego wiersza (rekordu)
252- if vUpdateStatus = usInserted then begin
253- pDataset.Refresh;
254- //Odśwież i wróć do odpowiedniego wiersza
255- pDataset.Locate(pKeyField,vLastID,[]);
256- end;
257-end;
258-
259-procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery);
260-//Ta procedura odświeża DataSet i ustawia kursor na ostatnim rekordzie
261-//Do użycia tylko wtedy, gdy DataSet ma gwarancję, że zostanie posortowany według klucza podstawowego z automatycznym przyrostem
262-var
263- vLastID: Integer;
264- vUpdateStatus : TUpdateStatus;
265-begin
266- vUpdateStatus := pDataset.UpdateStatus;
267- pDataset.ApplyUpdates;
268- vLastID:=(pDataSet.DataBase as TSQLite3Connection).GetInsertID;
269- if vUpdateStatus = usInserted then begin
270- pDataset.Refresh;
271- //Niebezpieczny!
272- pDataSet.Last;
273- end;
274-end;
275-
276-procedure TDataModule1.SQLQuery1AfterPost(DataSet: TDataSet);
277-begin
278- RefreshADatasetAfterInsert(Dataset as TSQLQuery); //Jeśli Twój DataSet jest posortowany według klucza podstawowego
279-end;
280-
281-procedure TDataModule1.SQLQuery2AfterPost(DataSet: TDataSet);
282-begin
283- RefreshADatasetAfterInsert(Dataset as TSQLQuery, 'ID'); //Jeśli nie masz pewności, że DataSet jest zawsze posortowany według klucza podstawowego
284-end;
235+ procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery);overload;
236+ procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery; pKeyField: string);overload;
237+
238+ implementation
239+
240+ procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery; pKeyField: string);
241+ //Ta procedura odświeża DataSet i ustawia kursor na ostatnim rekordzie
242+ //Do użycia, jeśli nie ma gwarancji, że DataSet zostanie posortowany według klucza podstawowego z automatycznym przyrostem
243+ var
244+ vLastID: Integer;
245+ vUpdateStatus : TUpdateStatus;
246+ begin
247+ vUpdateStatus := pDataset.UpdateStatus;
248+ //Pobierz ostatnio wstawiony identyfikator w bazie danych
249+ pDataset.ApplyUpdates;
250+ vLastID:=(pDataSet.DataBase as TSQLite3Connection).GetInsertID;
251+ //Teraz wróć do odpowiedniego wiersza (rekordu)
252+ if vUpdateStatus = usInserted then begin
253+ pDataset.Refresh;
254+ //Odśwież i wróć do odpowiedniego wiersza
255+ pDataset.Locate(pKeyField,vLastID,[]);
256+ end;
257+ end;
258+
259+ procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery);
260+ //Ta procedura odświeża DataSet i ustawia kursor na ostatnim rekordzie
261+ //Do użycia tylko wtedy, gdy DataSet ma gwarancję, że zostanie posortowany według klucza podstawowego z automatycznym przyrostem
262+ var
263+ vLastID: Integer;
264+ vUpdateStatus : TUpdateStatus;
265+ begin
266+ vUpdateStatus := pDataset.UpdateStatus;
267+ pDataset.ApplyUpdates;
268+ vLastID:=(pDataSet.DataBase as TSQLite3Connection).GetInsertID;
269+ if vUpdateStatus = usInserted then begin
270+ pDataset.Refresh;
271+ //Niebezpieczny!
272+ pDataSet.Last;
273+ end;
274+ end;
275+
276+ procedure TDataModule1.SQLQuery1AfterPost(DataSet: TDataSet);
277+ begin
278+ RefreshADatasetAfterInsert(Dataset as TSQLQuery); //Jeśli Twój DataSet jest posortowany według klucza podstawowego
279+ end;
280+
281+ procedure TDataModule1.SQLQuery2AfterPost(DataSet: TDataSet);
282+ begin
283+ RefreshADatasetAfterInsert(Dataset as TSQLQuery, 'ID'); //Jeśli nie masz pewności, że DataSet jest zawsze posortowany według klucza podstawowego
284+ end;
285285```
286286
287287### Vacuum i inne operacje, które należy wykonać poza transakcją
288288
289-Wydaje się, że baza danych SQLDB zawsze wymaga połączenia, ale niektóre operacje, takie jak Pragma i Vacuum, muszą odbywać się poza transakcją. Sztuka polega na tym, aby zakończyć transakcję, wykonać to, co musisz i zacząć ponownie przeprowadzić transakcję (aby sqldb się nie pomyliło :)
290-
291-``` pascal
292- // commit any pending operations or use a "fresh" sqlconnection
293- // zatwierdź wszelkie oczekujące operacje lub użyj „świeżego” sqlconnection
294- Conn.ExecuteDirect('End Transaction'); // Zakończ transakcję rozpoczętą przez SQLdb
295- Conn.ExecuteDirect('Vacuum');
296- Conn.ExecuteDirect('Begin Transaction'); //Rozpocznij transakcję dla SQLdb
289+Wydaje się, że baza danych SQLDB zawsze wymaga połączenia, ale niektóre operacje, takie jak Pragma i Vacuum, muszą odbywać się poza transakcją. Sztuka polega na tym, aby zakończyć transakcję, wykonać to, co musisz i zacząć ponownie przeprowadzić transakcję (aby sqldb się nie pomyliło :)
297290```
291+// commit any pending operations or use a "fresh" sqlconnection
292+ // zatwierdź wszelkie oczekujące operacje lub użyj „świeżego” sqlconnection
293+ Conn.ExecuteDirect('End Transaction'); // Zakończ transakcję rozpoczętą przez SQLdb
294+ Conn.ExecuteDirect('Vacuum');
295+ Conn.ExecuteDirect('Begin Transaction'); //Rozpocznij transakcję dla SQLdb
296+```
298297
299298## Używanie TSQLite3Dataset
300299
301-W tej sekcji szczegółowo opisano, jak używać komponentów TSQLite2Dataset i TSQLite3Dataset w celu uzyskania dostępu do baz danych SQlite. Luiz Américo luizmed(at)oi(kropka)com(kropka)br
300+W tej sekcji szczegółowo opisano, jak używać komponentów TSQLite2Dataset i TSQLite3Dataset w celu uzyskania dostępu do baz danych SQlite. Luiz Américo luizmed(at)oi(kropka)com(kropka)br
302301
303302#### Wymagania
304303
305-- Dla baz danych sqlite2 (starsze):
306- - FPC 2.0.0 lub nowszy
307- - Lazarus 0.9.10 lub nowszy
308- - Biblioteka uruchomieniowa SQLite 2.8.15 lub nowsza*
304+ * Dla baz danych sqlite2 (starsze):
305+ * FPC 2.0.0 lub nowszy
306+ * Lazarus 0.9.10 lub nowszy
307+ * Biblioteka uruchomieniowa SQLite 2.8.15 lub nowsza*
309308
310-- Sqlite2 nie jest już utrzymywany, a pliku binarnego nie można znaleźć na stronie sqlite
309+ * Sqlite2 nie jest już utrzymywany, a pliku binarnego nie można znaleźć na stronie sqlite
311310
312-- Dla baz danych sqlite3:
313- - FPC 2.0.2 lub nowszy
314- - Lazarus 0.9.11 (rewizja svn) lub nowszy
315- - biblioteka uruchomieniowa sqlite 3.2.1 lub nowsza (pobierz ją ze strony [www.sqlite.org](http://www.sqlite.org))
311+ * Dla baz danych sqlite3:
312+ * FPC 2.0.2 lub nowszy
313+ * Lazarus 0.9.11 (rewizja svn) lub nowszy
314+ * biblioteka uruchomieniowa sqlite 3.2.1 lub nowsza (pobierz ją ze strony [www.sqlite.org](<http://www.sqlite.org>))
316315
317316**Przed rozpoczęciem projektu Lazarus upewnij się, że:**
318317
319-- biblioteka sqlite jest albo
320- - w katalogach systemowych lub
321- - w katalogu plików wykonywalnych i katalogach Lazarus (lub bieżącego projektu) - ta opcja może działać tylko w systemie Windows
322-- pod Linuksem umieść cmem jako pierwszy moduł w sekcji uses programu głównego
323- - W Debianie, Ubuntu i innych dystrybucjach podobnych do Debiana, aby zbudować Lazarus IDE, musisz zainstalować pakiety libsqlite-dev/libsqlite3-dev, nie tylko sqlite/sqlite3 (dotyczy również OpenSuSe)
318+ * biblioteka sqlite jest albo
319+ * w katalogach systemowych lub
320+ * w katalogu plików wykonywalnych i katalogach Lazarus (lub bieżącego projektu) - ta opcja może działać tylko w systemie Windows
321+ * pod Linuksem umieść cmem jako pierwszy moduł w sekcji uses programu głównego
322+ * W Debianie, Ubuntu i innych dystrybucjach podobnych do Debiana, aby zbudować Lazarus IDE, musisz zainstalować pakiety libsqlite-dev/libsqlite3-dev, nie tylko sqlite/sqlite3 (dotyczy również OpenSuSe)
324323
325324#### Jak używać (podstawowe użycie)
326325
327-Zainstaluj pakiet znaleziony w katalogu /components/sqlite (zobacz instrukcje [[Install Packages|tutaj]])
326+Zainstaluj pakiet znaleziony w katalogu /components/sqlite (zobacz instrukcje [[Install Packages|tutaj]])
328327
329-W czasie projektowania ustaw następujące właściwości:
328+W czasie projektowania ustaw następujące właściwości:
330329
331-- FileName: ścieżka do pliku sqlite \[wymagana\]
332-- TableName: nazwa tabeli użytej w instrukcji sql \[wymagana\]
333-- SQL: instrukcja SQL select \[opcjonalna\]
334-- SaveOnClose: Wartość domyślna to false, co oznacza, że ​​zmiany nie są zapisywane. Można to zmienić na true. \[opcjonalna\]
335-- Active: Należy ustawić w czasie projektowania lub podczas uruchamiania programu. \[wymagana\]
330+ * FileName: ścieżka do pliku sqlite [wymagana]
331+ * TableName: nazwa tabeli użytej w instrukcji sql [wymagana]
332+ * SQL: instrukcja SQL select [opcjonalna]
333+ * SaveOnClose: Wartość domyślna to false, co oznacza, że ​​zmiany nie są zapisywane. Można to zmienić na true. [opcjonalna]
334+ * Active: Należy ustawić w czasie projektowania lub podczas uruchamiania programu. [wymagana]
336335
337336**Tworzenie tabeli (DataSet)**
338337
339-Kliknij dwukrotnie ikonę komponentu lub użyj elementu „Utwórz tabelę” z menu kontekstowego, które pojawia się po kliknięciu prawym przyciskiem myszy. Zostanie wyświetlony prosty, samoobjaśniający się edytor tabel.
338+Kliknij dwukrotnie ikonę komponentu lub użyj elementu „Utwórz tabelę” z menu kontekstowego, które pojawia się po kliknięciu prawym przyciskiem myszy. Zostanie wyświetlony prosty, samoobjaśniający się edytor tabel.
340339
341-Oto wszystkie typy pól obsługiwane przez TSqliteDataset i TSqlite3Dataset:
340+Oto wszystkie typy pól obsługiwane przez TSqliteDataset i TSqlite3Dataset:
342341
343-- Integer
344-- AutoInc
345-- String
346-- Memo
347-- Bool
348-- Float
349-- Word
350-- DateTime
351-- Date
352-- Time
353-- LargeInt
354-- Currency
342+ * Integer
343+ * AutoInc
344+ * String
345+ * Memo
346+ * Bool
347+ * Float
348+ * Word
349+ * DateTime
350+ * Date
351+ * Time
352+ * LargeInt
353+ * Currency
355354
356355**Pobieranie danych**
357356
358-Po utworzeniu tabeli lub na wcześniej utworzonej tabeli otwórz DataSet za pomocą metody Open. Jeśli właściwość SQL nie została ustawiona, zostaną pobrane wszystkie rekordy ze wszystkich pól, tak samo, jeśli ustawisz SQL na:
359-
360-``` pascal
357+Po utworzeniu tabeli lub na wcześniej utworzonej tabeli otwórz DataSet za pomocą metody Open. Jeśli właściwość SQL nie została ustawiona, zostaną pobrane wszystkie rekordy ze wszystkich pól, tak samo, jeśli ustawisz SQL na:
358+```
361359SQL := 'Select * from TABLENAME';
362360```
363361
364362**Wprowadzanie zmian do bazowego pliku danych**
365363
366-Aby użyć funkcji ApplyUpdates, zbiór danych musi zawierać co najmniej jedno pole, które spełnia wymagania klucza podstawowego (wartości muszą być UNIQUE, a nie NULL)
367-
368-Można to zrobić na dwa sposoby:
364+Aby użyć funkcji ApplyUpdates, zbiór danych musi zawierać co najmniej jedno pole, które spełnia wymagania klucza podstawowego (wartości muszą być UNIQUE, a nie NULL)
369365
370-- Ustaw właściwość PrimaryKey na nazwę pola klucza podstawowego
371-- Dodaj pole AutoInc (jest to łatwiejsze, ponieważ TSqliteDataSet automatycznie obsługuje je jako klucz podstawowy)
366+Można to zrobić na dwa sposoby:
372367
373-Jeśli spełniony jest jeden z dwóch warunków, po prostu wywołaj
368+ * Ustaw właściwość PrimaryKey na nazwę pola klucza podstawowego
369+ * Dodaj pole AutoInc (jest to łatwiejsze, ponieważ TSqliteDataSet automatycznie obsługuje je jako klucz podstawowy)
374370
375-``` pascal
371+Jeśli spełniony jest jeden z dwóch warunków, po prostu wywołaj
372+```
376373ApplyUpdates;
377374```
378375
379-> **Note:** Jeśli obydwa warunki są ustawione, pole odpowiadające PrimaryKey jest używane do zastosowania aktualizacji.
376+![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Uwaga:** Jeśli obydwa warunki są ustawione, pole odpowiadające PrimaryKey jest używane do zastosowania aktualizacji.
380377
381-> **Note:** Ustawienie klucza podstawowego na pole, które nie jest kluczem podstawowym, spowoduje utratę danych w przypadku wywołania funkcji ApplyUpdates, dlatego przed użyciem upewnij się, że wybrane pole nie zawiera wartości Null ani Unique.
378+![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Uwaga:** Ustawienie klucza podstawowego na pole, które nie jest kluczem podstawowym, spowoduje utratę danych w przypadku wywołania funkcji ApplyUpdates, dlatego przed użyciem upewnij się, że wybrane pole nie zawiera wartości Null ani Unique.
382379
383380##### Przykład Master/detail
384381
385-Różne przykłady relacji master/detail (np. relacja pomiędzy klientem a zamówieniem):
382+Różne przykłady relacji master/detail (np. relacja pomiędzy klientem a zamówieniem):
386383
387-- ogólny sposób SQLDB na wykonanie tego przy użyciu właściwości `DataSource`:
388-- Konkretny przykład TSQLite3 używający lokalizację: [[TSqlite3 Przykład wzorca Master]].
384+ * ogólny sposób SQLDB na wykonanie tego przy użyciu właściwości `DataSource`:
385+ * Konkretny przykład TSQLite3 używający lokalizację: [[TSqlite3 Przykład wzorca Master]].
389386
390387#### Uwagi
391388
392-- Chociaż TSqliteDataset został przetestowany dla 10 000 rekordów i działał dobrze, to przechowuje wszystkie dane w pamięci, więc pamiętaj, aby pobrać tylko niezbędne dane (zwłaszcza w przypadku pól Memo).
393-- Ten sam plik danych (właściwość Filename) może zawierać kilka tables/datasets
394-- Kilka DataDets (różne kombinacje pól) można utworzyć jednocześnie przy użyciu tej samej tabeli
395-- Możliwe jest filtrowanie danych za pomocą SQL-owej instrukcji WHERE, zamykanie i ponowne otwieranie DataSet (lub wywołanie metody RefetchData). Ale w tym przypadku kolejność i liczba pól muszą pozostać takie same
396-- Możliwe jest również użycie złożonych instrukcji SQL przy użyciu aliasów, złączeń, widoków w wielu tabelach (pamiętaj, że muszą one znajdować się w tym samym pliku danych), ale w tym przypadku ApplyUpdates nie zadziała. Jeśli ktoś chce używać skomplikowanych zapytań i zastosować aktualizacje do pliku danych, napisz do mnie, a dam kilka wskazówek, jak to zrobić
397-- Ustawienie nazwy pliku na plik danych sqlite nie utworzony przez TSqliteDataset i otwarcie go jest dozwolone, ale niektóre pola nie będą miały wykrytego prawidłowego typu pola. Będą one traktowane jako pola tekstowe.
389+ * Chociaż TSqliteDataset został przetestowany dla 10 000 rekordów i działał dobrze, to przechowuje wszystkie dane w pamięci, więc pamiętaj, aby pobrać tylko niezbędne dane (zwłaszcza w przypadku pól Memo).
390+ * Ten sam plik danych (właściwość Filename) może zawierać kilka tables/datasets
391+ * Kilka DataDets (różne kombinacje pól) można utworzyć jednocześnie przy użyciu tej samej tabeli
392+ * Możliwe jest filtrowanie danych za pomocą SQL-owej instrukcji WHERE, zamykanie i ponowne otwieranie DataSet (lub wywołanie metody RefetchData). Ale w tym przypadku kolejność i liczba pól muszą pozostać takie same
393+ * Możliwe jest również użycie złożonych instrukcji SQL przy użyciu aliasów, złączeń, widoków w wielu tabelach (pamiętaj, że muszą one znajdować się w tym samym pliku danych), ale w tym przypadku ApplyUpdates nie zadziała. Jeśli ktoś chce używać skomplikowanych zapytań i zastosować aktualizacje do pliku danych, napisz do mnie, a dam kilka wskazówek, jak to zrobić
394+ * Ustawienie nazwy pliku na plik danych sqlite nie utworzony przez TSqliteDataset i otwarcie go jest dozwolone, ale niektóre pola nie będą miały wykrytego prawidłowego typu pola. Będą one traktowane jako pola tekstowe.
398395
399-Ogólne przykłady można znaleźć w katalogu SVN fpc/fcl-db/src/sqlite
396+Ogólne przykłady można znaleźć w katalogu SVN fpc/fcl-db/src/sqlite
400397
401398## Zobacz także
402399
403-- [[SQLdb Tutorial1]] Samouczek do Sqlite
404-- [[SqlDBHowto]] Ogólne informacje o SQLDB
405-- [[Working With TSQLQuery]] Informacje o TSQLQuery bazy danych SQL
406-- [Witryna SQLite](http://www.sqlite.org)
400+ * [[SQLdb Tutorial1]] Samouczek do Sqlite
401+ * [[SqlDBHowto]] Ogólne informacje o SQLDB
402+ * [[Working With TSQLQuery]] Informacje o TSQLQuery bazy danych SQL
403+ * [Witryna SQLite](<http://www.sqlite.org>)
407404
408405---
409-*From the Free Pascal wiki, page "SQLite/pl", as it stood on 2021-11-20 after a change by Slawek, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
406+*From the Free Pascal wiki, page "SQLite/pl", as the Internet Archive kept it on 2024-09-08, last changed on 2021-11-21. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history