Datenbankzugriff in Lazarus - eine Odyssee!?

Für Fragen von Einsteigern und Programmieranfängern...
hum4n0id3
Beiträge: 301
Registriert: So 5. Mai 2019, 15:23

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von hum4n0id3 »

Michel hat geschrieben:
Sa 8. Jan 2022, 14:32
Mein Ziel ist es, auf eine Tabelle in einer SQLite3-Datenbank zuzugreifen, Datensätze zu erfassen, ändern und zu löschen. Ich hätte nicht erwartet, hier auf solche massiven Probleme zu stoßen. Ich verfüge aber auch nicht über genügend Kenntnisse, hier in der IDE die Fehlersuche zu betreiben.
Möglich das die ein oder anderen Kenntnisse dir im Weg stehen und dieses Problem jetzt zu begreifen. Das passiert mir zumindest ständig. Ich kann nur sagen das ich es Anfangs auch nicht verstanden habe und es mir paar Tage den Kopf zerbrochen hat. Danach hatte ich unter Windows mit Lazarus eine kleine Todo gehabt, das aus der SQLite-Datenbank gelesen hat und ich auch schreiben konnte. Es wäre etwas einfacher wenn du auch Code zeigen würdest, somit wir sehen können, wo das Problem liegen kann. Ich kann mich jetzt aus dem Stand an folgende Schritte erinnern.

1. Datenbank öffnen
2. SQL-Befehl ausführen
3. Datenbank schließen

in etwa so:

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
begin
  //SQLiteLibraryName := 'sqlite3.dll';
  SQLite3Connection1.DatabaseName := 'db_address.db';
  SQLite3Connection1.Connected := True;
  SQLQuery2.SQL.Clear;
  SQLQuery2.SQL.Add('insert into tb_address (phone, name) values ("123456789", "George")');
  SQLQuery2.ExecSQL;
  SQLTransAction1.Commit;    // <===== commit changes
  SQLQuery2.Close;
  //SQLQuery2.Active := True;
end;
Hier der Thread wo ich das jetzt rausgekramt habe, https://forum.lazarus.freepascal.org/in ... ic=16852.0

Ich baue auch mal jetzt eine kleine TestDB. Damals hatte ich aber Probleme die SQLite einzubinden. Danach ging alles recht schnell. Wie es jetzt unter Linux ist, weiß ich nicht.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von Winni »

hum4n0id3 hat geschrieben:
Sa 8. Jan 2022, 17:40

Das wäre mir neu, das Debian nur als Server-Betriebssystem gedacht worden ist.
.....

Linux! wurde am Anfang gar nicht als Server-System gedacht und nur als Betriebssystem für Home-Computer :)
Hi

Natürlich rede ich nur über Debian stable. Dass da ein gutes Server-Betriebssystem ist, ist Allgemeingut. Dass die Debian-Gemeinde immer wieder versucht hat, den Desktop zu verhindern, sei an zwei Beispielen verdeutlich:

* die Installation von fpc/Lazarus vor 10 Jahren war ein Abenteuer. Ohne Key ging garnix und dann musste mn sich alles selbst kompilieren. Den Key und eine detailierte Anweisung gab es dann glücklicherweise im Netz von einem Fan. Alleine hätte ich es nie geschafft.
Und noch heute schaffen sie es nicht eine vernünftige fpc/Lazarus-Distribution zu packen! Immmer die DEB-Pakete von fpc nehmen!
* Der zweite Bolzen war die Verhinderung von Firefox, weil er zu "gefährlich" war. Man sollte das selbstgestrickte Iceweasel nehmen, dass allerdings wenig konnte. Die Installation von FF war voller von Debian gestellter Fallen. Ein ziemlich kindisches Verhalten eines angeblich offenen Systems.

Linux war Anfang der 90er nicht als Server-Betriebssystem gedacht. Windows auch nicht! Damals hatte man für kleinere Netze entweder Novell Netware. Für größere eine teure Unix-Kiste. Während vor Windows NT das System nicht als Server einsetzbar war, ging das bei Linux zügiger. Ich hab ca. 1995 den ersten Linux Server aufgesetzt. Weil Novell für das Modul CD ,ein Schweinegeld haben wollte. Das CD-Lesen und -Schreiben fiel bei Linux aus der Tüte.

Winni
Zuletzt geändert von Winni am Sa 8. Jan 2022, 18:17, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von af0815 »

Bei komischen Fehleren in Lazarus, ganz einfach mal das Logging von Lazarus einschalten und das Problem 'erzwingen'. Im Logging und auf der Kommandozeile kommen oft die eigentlichen Schwierigkeiten zu Tage.

Das nächste ist, ganz einfach ein Testprogramm zu erstellen, wo man den Fehler sehen kann. Das hilft immer, entweder man findet vorher selbst den Fehler, oder er wird für andere sichtbar.

Und wenn eine SQLite DB sagt 'database is locked' dann sollte man schauen was man selbst verbockt hat. Man kann sich die nur selbst sperren. Entweder greift ein zweites Programm drauf zu oder man hat eine Änderung nicht abgeschlossen. Sqlite ist kein Datenbankserver, der mit 'locking' sehr gut umgehen kann.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
six1
Beiträge: 788
Registriert: Do 1. Jul 2010, 19:01

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von six1 »

Ja, aber das ist doch schon ne Zeit vorbei Winni!
Das Bullseye geht like a charme... NULL Probleme.

Dann einfach fpcupdeluxe und fertig ist die Kiste 8)
Gruß, Michael

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von Winni »

six1 hat geschrieben:
Sa 8. Jan 2022, 18:15
Ja, aber das ist doch schon ne Zeit vorbei Winni!
Das Bullseye geht like a charme... NULL Probleme.

Dann einfach fpcupdeluxe und fertig ist die Kiste 8)
Hi!

Das ändert nix an der Tatsache, dass die von Debian mitgelieferten Pakete für fpc/Lazarus fehlerhaft sind und ein nerviges Grundrauschen im internationalen Forum verursachen von Usern, die diesen Fakt nicht kennen.


Winni

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von af0815 »

Die sind nicht defekt, nur in der Philosophi unterschiedlich. Es geht darum, das Lazarus sich selbst neu erstellen muss, das passt nicht in das Schema von den Distributionen.

Das durchbricht fpcupdeluxe, weil es damit komplett in den Benutzerbereich verschoben wird.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von Winni »

af0815 hat geschrieben:
Sa 8. Jan 2022, 19:45
Die sind nicht defekt, nur in der Philosophi unterschiedlich. Es geht darum, das Lazarus sich selbst neu erstellen muss, das passt nicht in das Schema von den Distributionen.
Hi!

Das ist dem Anfänger auf Debian ziemlich egal. Der stellt nur fest: Dies & Das geht nicht mit Lazarus.

Winni

hum4n0id3
Beiträge: 301
Registriert: So 5. Mai 2019, 15:23

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von hum4n0id3 »

Nicht hübsch, dafür selten. Bei mir funktioniert auch unter Linux mit SQLite zu schreiben.
Dateianhänge
project1.zip
(126.08 KiB) 49-mal heruntergeladen

hum4n0id3
Beiträge: 301
Registriert: So 5. Mai 2019, 15:23

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von hum4n0id3 »

Winni hat geschrieben:
Sa 8. Jan 2022, 18:11

* Der zweite Bolzen war die Verhinderung von Firefox, weil er zu "gefährlich" war. Man sollte das selbstgestrickte Iceweasel nehmen, dass allerdings wenig konnte. Die Installation von FF war voller von Debian gestellter Fallen. Ein ziemlich kindisches Verhalten eines angeblich offenen Systems.
Hier die ganze Geschichte, https://de.wikipedia.org/wiki/Namensstr ... nd_Mozilla. Ich habe damals auch Debian verwendet und musste dann auf IceWeasel umsteigen. Aber ich kann Debian dies bezüglich auch verstehen. Nach deren Regeln wäre Firefox in non-free gelandet und der Anwender hätte zunächst mit Konqueror oder so klar kommen müssen.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von Winni »

Hi!

Da musste man nicht auf Iceweasel umsteigen.

Ich lass mir doch nicht von Software vorschreiben, was ich darf und was nicht.

Weder unter Debian noch unter Windows.

Natürlich hab ich FF installiert. Auch wenn es dornig war.

Debian hat eben nicht verstanden, was freie Software bedeutet. Eine kleine Gemeinde von Möchte-Gern-Diktatoren.

Winni

Michel
Beiträge: 35
Registriert: Sa 4. Dez 2021, 11:43
OS, Lazarus, FPC: Windows 10 / Ubuntu 20.04 LTS (L 2.0.12 FPC 3.2.0)
CPU-Target: 64Bit

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von Michel »

Nun bin ich zumindest froh, dass hier sich die Leute Mühe geben, mir auf die Sprünge zu helfen.

Ich komme von Delphi7, daher habe ich lediglich die zwingend erforderlichen Parameter mit sinnvollen Werten gefüllt.

Die Datenbank heißt SQL3DB.db und die Tabelle Artikel. Der SQL-Code für die Erstellung via sqlitebrowser (http://sqlitebrowser.org) lautet:

Code: Alles auswählen

CREATE TABLE "Artikel" (
	"id"	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
	"Code"	NUMERIC,
	"Bezeichnung"	varchar(20)
)
Ich habe abgesehen von dem Commit ausschließlich nur die graphischen Komponenten integriert und mit Daten versehen:

Die unit.lfm schaut so aus:

Unit.lfm

Code: Alles auswählen

object Form1: TForm1
  Left = 655
  Height = 308
  Top = 311
  Width = 563
  Caption = 'Form1'
  ClientHeight = 308
  ClientWidth = 563
  OnCreate = FormCreate
  LCLVersion = '2.0.12.0'
  object DBGrid1: TDBGrid
    Left = 16
    Height = 176
    Top = 16
    Width = 272
    Color = clWindow
    Columns = <>
    DataSource = DataSource1
    TabOrder = 0
  end
  object DBNavigator1: TDBNavigator
    Left = 16
    Height = 25
    Top = 200
    Width = 272
    BevelOuter = bvNone
    ChildSizing.EnlargeHorizontal = crsScaleChilds
    ChildSizing.EnlargeVertical = crsScaleChilds
    ChildSizing.ShrinkHorizontal = crsScaleChilds
    ChildSizing.ShrinkVertical = crsScaleChilds
    ChildSizing.Layout = cclLeftToRightThenTopToBottom
    ChildSizing.ControlsPerLine = 100
    ClientHeight = 25
    ClientWidth = 272
    DataSource = DataSource1
    Options = []
    TabOrder = 1
  end
  object Button1: TButton
    Left = 296
    Height = 25
    Top = 200
    Width = 75
    Caption = 'Commit'
    OnClick = Button1Click
    TabOrder = 2
  end
  object SQLite3Connection1: TSQLite3Connection
    Connected = True
    LoginPrompt = False
    DatabaseName = '/home/administrator/Dokumente/Projekte/sqlite3demo/SQL3DB.db'
    KeepConnection = False
    Transaction = SQLTransaction1
    AlwaysUseBigint = False
    Left = 440
    Top = 24
  end
  object SQLTransaction1: TSQLTransaction
    Active = True
    Action = caCommit
    Database = SQLite3Connection1
    Left = 440
    Top = 98
  end
  object SQLQuery1: TSQLQuery
    IndexName = 'DEFAULT_ORDER'
    MaxIndexesCount = 4
    FieldDefs = <    
      item
        Name = 'id'
        DataType = ftAutoInc
        Precision = -1
      end    
      item
        Name = 'Code'
        DataType = ftLargeint
        Precision = -1
      end    
      item
        Name = 'Bezeichnung'
        DataType = ftString
        Precision = -1
        Size = 20
      end>
    Active = True
    Database = SQLite3Connection1
    Transaction = SQLTransaction1
    SQL.Strings = (
      'select * from Artikel;'
    )
    Params = <>
    Left = 328
    Top = 24
  end
  object DataSource1: TDataSource
    DataSet = SQLQuery1
    Left = 333
    Top = 98
  end
end
Und in der unit.pas ist folgender Code enthalten:

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, SQLite3Conn, SQLDB, DB, Forms, Controls, Graphics, Dialogs,
  DBGrids, DBCtrls, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    SQLite3Connection1: TSQLite3Connection;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  SQLTransaction1.Commit;
end;

end.
Nach meinem Verständnis und mit der Arbeit mit Delphi und einer Vielzahl von SQL-Datenbanken, reicht der SQL-Befehl für den Abruf der Daten aus, damit die Komponenten, die jeweiligen SQL-Befehle für die Insert, Updates und Delete kreieren kann. Während der Laufzeit gelingen auch die Inserts, Updates und Delete, allerdings steht das Commit noch aus. Sobald das (z.Zt auf Taste, automatisch habe ich noch ganz andere Probleme) folgt, wird die Verbindung zur Datenbank schlicht geschlossen, ohne dass eine Änderung erfolgt.
Dateianhänge
Bildschirmfoto von 2022-01-09 12-49-19.png
Bildschirmfoto von 2022-01-09 12-49-19.png (19.44 KiB) 1069 mal betrachtet

Michel
Beiträge: 35
Registriert: Sa 4. Dez 2021, 11:43
OS, Lazarus, FPC: Windows 10 / Ubuntu 20.04 LTS (L 2.0.12 FPC 3.2.0)
CPU-Target: 64Bit

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von Michel »

Und wenn ich z.B. SQLLiteConnection1.Connected im Entwurfsmodus wechsel, also von true auf false und umgekehrt, kommt die Meldung "Access Violation".

Und wenn ich dann versuche, mit Strg-S das Projekt zu sichern, kommt Streaming-Fehler, mit dem Ergebnis, IDE kann nur ohne Änderung geschlossen werden.
Dateianhänge
Bildschirmfoto von 2022-01-09 13-25-15.png
Bildschirmfoto von 2022-01-09 13-25-15.png (12.9 KiB) 1066 mal betrachtet
Bildschirmfoto von 2022-01-09 13-22-38.png
Bildschirmfoto von 2022-01-09 13-22-38.png (4.05 KiB) 1066 mal betrachtet

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von wp_xyz »

Es wäre für uns leichter, wenn du das Test-Projekt komplett kompilierbar posten würdest anstatt die pas und lfm-Dateien in den Beitrag zu kopieren; so muss sich jeder sein eigenes Projekt bauen und macht dabei vielleicht noch ein paar Sachen anders als du. Einfach die .lpi, .lpr, .lfm und .pas-Dateien sowie die Datenbank-Datei (sofern sie nicht vom Programm selbst erstellt wird) zusammen in ein zip packen und das hier hochladen.

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von gladio »

Kann es sein, dass diese Fehlermeldung nichts mit Datenbank-Anbindung zu tun hat.
Weist doch eher auf irgendwas mit dem Form1 hin.

Michel
Beiträge: 35
Registriert: Sa 4. Dez 2021, 11:43
OS, Lazarus, FPC: Windows 10 / Ubuntu 20.04 LTS (L 2.0.12 FPC 3.2.0)
CPU-Target: 64Bit

Re: Datenbankzugriff in Lazarus - eine Odyssee!?

Beitrag von Michel »

Ich habe nun einmal die .lpi, .lpr, .lfm und .pas-Dateien sowie die Datenbank-Datei gezippt. Ich hoffe das passt so.
Dateianhänge
SQL3Lite-Demo.zip
(65.47 KiB) 47-mal heruntergeladen

Antworten