Neue SQLite-DB Anlegen funktioniert nicht

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Neue SQLite-DB Anlegen funktioniert nicht

Beitrag von Aliobaba »

Hallo,

ich versuche mit dem unten gezeigten Code eine neue Datenbank zu erstellen.
Leider funktioniert das nicht.

Zunächst wird ein völlig neues und leeres ".sqlite"-File erstellt. Das funktioniert.
Das Programm kommt bis zum 1. "ShowMessage" : "ok1?"
Dann kommt die Fehlermeldung: SQL logic error

Woran kann das liegen? Wenn ich den Befehl in den DB-Editor "DB Browser for SQLite" eingebe, nachdem das leere ".sqlite"-File erstellt ist, dann wird der Befehl problemlos ausgeführt.

Code: Alles auswählen

procedure TForm_Start.Bt_Erstellen_DBClick(Sender: TObject);
var
  SL_File : TStringlist;
begin
    SL_File:= TStringlist.Create;
    SL_File.Clear;
    SL_File.SaveToFile (PChar( Pfad_zum_Fundus_SQL + 'Pl_x2.sqlite' ) ) ;

    Form_Start.ZConneu.Database:= PChar( Pfad_zum_Fundus_SQL + 'Pl_x2.sqlite' ) ;
    Form_Start.ZConneu.Connected:=true;
    Showmessage('ok1?');
    Form_Start.ZConneu.ExecuteDirect( 'CREATE TABLE "My__PL" ( "PL__Id" INTEGER NOT NULL, "CxxSort" VARCHAR(200),  "CxxPfad" VARCHAR(200), PRIMARY KEY("PL__Id" AUTOINCREMENT) )   ');
    //  -->> SQL logic error

    Showmessage('ok2?');
    SL_File.Free;
end;
{
Wenn man aber den Befehl eingibt in den "DB Browser for SQLite" dann:

Ausführung wurde ohne Fehler beendet.
Ergebnis: Query erfolgreich ausgeführt. Benötigte 0ms
In Zeile 1:
CREATE TABLE "My__PL" ( "PL__Id" INTEGER NOT NULL, "CxxSort" VARCHAR(200),  "CxxPfad" VARCHAR(200), PRIMARY KEY("PL__Id" AUTOINCREMENT) )
}
Woran könnte das liegen?

Aliobaba

Versionen: Lazarus 2.0.12 (Windows-Version)
aktuelle Zeos Version, mit der der Befehl "ZConneu.ExecuteDirect" sonst problemlos funktioniert.
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Neue SQLite-DB Anlegen funktioniert nicht

Beitrag von Aliobaba »

Sorry; der Beitrag sollte eigentlich in die Rubrik "Datenbanken"....
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
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: Neue SQLite-DB Anlegen funktioniert nicht

Beitrag von af0815 »

Das Schnipsel hier geht sicher mit SQLDB

Code: Alles auswählen

function TDataModule1.CreateLokalDB:boolean;
  var
  SQLiteCon : TSQLite3Connection;
  SQLiteTrans : TSQLTransaction;
begin
  DebugLn('CreateLokalDB start');
  Result := false;
  SQLiteCon := TSQLite3Connection.Create(nil);
  SQLiteTrans := TSQLTransaction.Create(nil);
  try
    // Connection prepare
    SQLiteCon.Transaction := SQLiteTrans;
    SQLiteCon.DatabaseName:= FLocalTempFileName;
    if not FileExists(FLocalTempFileName) then begin
    // Datenbank gibt es nicht !!
      try
        SQLiteCon.Open;
        SQLiteTrans.Active:= true;
        SQLiteCon.ExecuteDirect('CREATE TABLE IF NOT EXISTS B_xxxxxx('+
                      ' "D_DateTime" DateTime NOT NULL,'+
                      ' "D_Source" Char(10),'+
                      ' "D_Data" char(30));');
        SQLiteTrans.Commit;
      except
        on E : Exception do begin
          Debugln('CreateLokalDB Create B_xxxxxx Exception =>' + E.Message);
          raise;
        end;
      end;
    end;
    Result:= true;
  finally
    SQLiteCon.free;
    SQLiteTrans.free;
  end;
  DebugLn('CreateLokalDB end');
end;     
Mal will der eine keine Hochkommas an einer Stelle, manchmal will wer einen Strichpunkt am Zeilenende. Es ist manchmal mühsam.

Im Lazarusverzeichnis unter /tools/lazdatadesktop gibt es den Lazarus Datadesktop, der hilft mir schon mal, was zu testen - Lazaruskompatibel 8) Ach ja, kompilieren muss man den sich schon selbst.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Neue SQLite-DB Anlegen funktioniert nicht

Beitrag von Aliobaba »

... funktioniert prima!! Herzlichen Dank, af0815!!

Ich habe allerdings die Funktion so umgebaut, dass man den Pfad zur DB als String-Variable übergeben kann:

Code: Alles auswählen

function TForm_Start.CreateLokalDB (A_Pfad : string ):boolean;
  var
  SQLiteCon : TSQLite3Connection;
  SQLiteTrans : TSQLTransaction;
  FLocalTempFileName : string;
begin
  FLocalTempFileName := PChar( A_Pfad ) ;
  DebugLn('CreateLokalDB start');
  Result := false;
  SQLiteCon := TSQLite3Connection.Create(nil);
  SQLiteTrans := TSQLTransaction.Create(nil);
  try
    // Connection prepare
    SQLiteCon.Transaction := SQLiteTrans;
    SQLiteCon.DatabaseName:= FLocalTempFileName;
    if not FileExists(FLocalTempFileName) then begin
    // Datenbank gibt es nicht !!
      try
        SQLiteCon.Open;
        SQLiteTrans.Active:= true;

        SQLiteCon.ExecuteDirect (' CREATE TABLE "My__PL" ( "PL__Id" INTEGER NOT NULL, "CxxSort" VARCHAR(200),  "CxxPfad" VARCHAR(200), PRIMARY KEY("PL__Id" AUTOINCREMENT) )' );

        SQLiteTrans.Commit;
      except
        on E : Exception do begin
          Debugln('CreateLokalDB Create B_xxxxxx Exception =>' + E.Message);
          raise;
        end;
      end;
    end;
    Result:= true;
  finally
    SQLiteCon.free;
    SQLiteTrans.free;
  end;
  DebugLn('CreateLokalDB end');
end;   
Da ich bisher nur mit "Zeos" gearbeitet habe, hatte ich zwar schon einige kleinere Probleme, diesen Code unter "SQLdb" einzubauen, aber nun funktioniert das prima! Trotzdem war ich mit "Zeos" stets hoch zufrieden!
Es stellt sich jetzt für mich die Frage, ob es sinnvoll ist (Prinzip, möglichst schlanken Code zu erzeugen), völlig auf "SQLdb" umzusteigen: Was meinst Du??
Zumal ich ja mit dem Befehl "ExecuteDirect" schon mal unter Zeos seltsame Probleme hatte:
viewtopic.php?f=17&t=13734
Kann es sein, dass "SQLdb" zuverlässiger funktioniert, weil es ja "von Haus aus" in Lazarus eingebunden ist?

Grüße - und nochmal Danke!
Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
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: Neue SQLite-DB Anlegen funktioniert nicht

Beitrag von af0815 »

Grundlegend haben SQLDB und ZEOS alles an Board, was man so braucht. Vor etlichen Jahren hatte ZEOS die Nase vorne, das hat sich mittlerweile geändert. Stabil sind beide. Zuverlässig sind beide, kleine Features wird man immer wieder entdecken :D .

ZEOS mach Sinn dann, wenn man Delphi und Lazaus pflegen muss.

Wenn nur Lazarus, verwende ich SQLDB, da es Komponenten gibt, die mit ZEOS nicht können (z.B. fpreport) und SQLDB nativ Lazarus (genaugenommen fpc) ist. Entsprechen kann man auch den normalen Bugtracker verwenden.

Es ist Geschmackssache, aber ein Umstieg im Projekt tut weh, egal ich welche Richtung, da immer ein paar Kleinigkeiten anders sind. :mrgreen:

BTW: Bei mir liegen die ganzen DB Sachen in einem eigenen Datenmodul und nicht im Hauptfenster. Deswegen war der lokale Name als Objektvariable definiert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten