Firebird

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
petermännchen
Beiträge: 92
Registriert: So 26. Aug 2007, 20:35
OS, Lazarus, FPC: Win7, Laz 1.2.6, FPC 2.6.4, SVN 33306, ZEOS 7.1.4
CPU-Target: 32Bit
Wohnort: Helmstedt
Kontaktdaten:

Firebird

Beitrag von petermännchen »

Hallo beisammen,

ich tu mich ein wenig schwer, in Lazarus eine Tabelle zu öffnen.

Folgendes liegt auf dem Formular:

TIBConnection
TSQLTransaction
TSQLQuery
TDatasource

TIBConnection wurde mit TSQLTransaction verbunden.
Properties sind ausgefüllt und Verbindung steht (FB 2.0)

TSQLQuery wurde mit der TIBConnection verbunden.
Selectsql der Komponente ist eine einfache Selektion: 'Select * from Artikeldaten'.

So, rechte Maustaste und Felder bearbeiten - Felder hinzufügen: Es war nicht möglich, die Liste der Felder...

Setzen der Eigenschaft active auf true geht nicht.

Was mache ich falsch?

Laz.: 0.9.24 beta (12752)
Freepascal: 2.2.0

Vielen Dank und Gruß

Peter

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Beitrag von knight »

Ich habe ein einfaches Tutorial im Wiki verfaßt: http://wiki.lazarus.freepascal.org/SQLdb_Tutorial1/de Vielleicht hilft es dir weiter.

knight

petermännchen
Beiträge: 92
Registriert: So 26. Aug 2007, 20:35
OS, Lazarus, FPC: Win7, Laz 1.2.6, FPC 2.6.4, SVN 33306, ZEOS 7.1.4
CPU-Target: 32Bit
Wohnort: Helmstedt
Kontaktdaten:

Beitrag von petermännchen »

knight hat geschrieben:Ich habe ein einfaches Tutorial im Wiki verfaßt: http://wiki.lazarus.freepascal.org/SQLdb_Tutorial1/de Vielleicht hilft es dir weiter.

knight


@knight,

Danke schön! Werde ich morgen früh durchkämmen :)

Gruß

Peter
Zeiterfassung, einfach gerechter!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: Firebird

Beitrag von af0815 »

petermännchen hat geschrieben:TIBConnection wurde mit TSQLTransaction verbunden.
Properties sind ausgefüllt und Verbindung steht (FB 2.0)


Ich vermute nein, denn Probleme in der Verbindung werden oft auch erst sichtbar, wenn die erste Query so wirklich was anfordert. Die Anzeichen bei deuten darauf hin.

Ich empfehle ein Update auf eine relativ neue Version (besonders FPC), da sich sehr viel an Bugfixing auch im DB Bereich getan hat.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

petermännchen
Beiträge: 92
Registriert: So 26. Aug 2007, 20:35
OS, Lazarus, FPC: Win7, Laz 1.2.6, FPC 2.6.4, SVN 33306, ZEOS 7.1.4
CPU-Target: 32Bit
Wohnort: Helmstedt
Kontaktdaten:

Beitrag von petermännchen »

@af0815

der letzte Tip war es. Habe die full 0.9.25 installiert mit FPC 2.2.1
jetzt kann ich die Tabelle öffnen und anzeigen.

Was aber nciht klappt:
- zeos läßt sich nicht installieren
- laszdatadesktop läßt sich nicht installieren
- zcore, zjpegforlazarus, zparsesql, zplain, zdbc und zcomponent wurden nicht mitinstalliert. Gibt jedes mal nen Mecker bei Programmstart.

Also leicht wird einem der Einstieg in Lazarus nicht gemacht!

Vielen Dank für eure Hilfen.

Gruß

Peter
Zeiterfassung, einfach gerechter!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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:

Beitrag von af0815 »

petermännchen hat geschrieben:- zcore, zjpegforlazarus, zparsesql, zplain, zdbc und zcomponent wurden nicht mitinstalliert.


Wenn ZEOS nicht geht, so ist auch klar, warum er das anmeckert, es gehört fast alles zu ZEOS. Räum es mal raus.

petermännchen hat geschrieben:Also leicht wird einem der Einstieg in Lazarus nicht gemacht!


Es ist noch Beta und die Plattformunabhängigkeit bedingt auch ein paar Opfer, besonders wenn man von Delphi kommt. Aber in großen und ganzen kann man sich nach einer Einarbeitungszeit recht wohl damit fühlen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Beitrag von knight »

- laszdatadesktop läßt sich nicht installieren

Dieses Package benötigt FPC 2.3.1

knight

petermännchen
Beiträge: 92
Registriert: So 26. Aug 2007, 20:35
OS, Lazarus, FPC: Win7, Laz 1.2.6, FPC 2.6.4, SVN 33306, ZEOS 7.1.4
CPU-Target: 32Bit
Wohnort: Helmstedt
Kontaktdaten:

Beitrag von petermännchen »

@knight
sehe ich das richtig, dass 2.3.1 nur selbst erstellt werden kann?

Zu den Felddefinitionen:
Im Unterschied zu Delphi wird die SQLQuery nicht automatisch geöffnet, wenn ich die Felder im Feldeditor einlesen möchte. Das war gewöhnungsbedürftig.

Nun eine weitere Frage:
Ich rufe eine bestehende Tabelle auf, um diese im DBGrid anzuzeigen.
Das klappt.
Felder die ich nicht sehen will kann ich ausblenden, habe ich gefunden.

OHNE UpdateSQL kann ich edititeren! Das Ergebnis bleibt auch erhalten, wenn ich in den nächsten Datensatz wechsele. Sogar beim Scrollen der Datenmenge im DBGrid (Aufruf der nächsten 20 Datensätze) bleibt das Ergebnis erhalten.

Schließen und neu öffnen: Änderung ist weg.

Das betrifft auch delete und insert.

Sichern der Änderungen mittels verknüpften DBNavigator bringt nichts.
SQLTransaction.commit for Schließen der Datenmenge auch nichts.

Ich vermute, ich muß die Entsprechenden Anweisungen in der Komponente SQLQuery1 setzen.
Allerdings ein "Delete from Artikeldaten where ID = :ID" scheint nicht zu reichen.
Wie gehe ich vor?

Gruß

Peter
Zeiterfassung, einfach gerechter!

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Beitrag von knight »

sehe ich das richtig, dass 2.3.1 nur selbst erstellt werden kann?

Im Gegensatz zu Version 2.2.0 gibt es 2.3.1 nur als Sourcecode. Man muß diesen selbst kompilieren (was man z.B. mit einem (parallel) installierten Lazarus erledigen kann).

Was die Probleme im Umgang mit sqldb betrifft, so solltest du am besten einen Auszug aus deinem Quelltext veröffentlichen. So kann man vorhandene Fehler meist am schnellsten erkennen.

knight

petermännchen
Beiträge: 92
Registriert: So 26. Aug 2007, 20:35
OS, Lazarus, FPC: Win7, Laz 1.2.6, FPC 2.6.4, SVN 33306, ZEOS 7.1.4
CPU-Target: 32Bit
Wohnort: Helmstedt
Kontaktdaten:

Beitrag von petermännchen »

Hallo Knight,

ich habe versucht, ausschließlich das Gespann Lazarus/FPC wirken zu lassen

aber hier der Quelltext:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
IBConnection, sqldb, db, DBGrids, DbCtrls, ExtCtrls;

type

{ TForm1 }

TForm1 = class(TForm)
Datasource1: TDatasource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
IBConnection1: TIBConnection;
Panel1: TPanel;
SQLQuery1: TSQLQuery;
SQLQuery1ARTIKELNUMMER1: TLongintField;
SQLQuery1AVKN1: TSmallintField;
SQLQuery1BEZEICHNUNG1: TStringField;
SQLQuery1BEZUGSARTIKEL1: TLongintField;
SQLQuery1EINHEIT1: TStringField;
SQLQuery1FARBE1: TStringField;
SQLQuery1FILIALID1: TLongintField;
SQLQuery1ID1: TLongintField;
SQLQuery1KASSENARTIKEL1: TSmallintField;
SQLQuery1KENNUNG1: TStringField;
SQLQuery1LAGERARTIKEL1: TSmallintField;
SQLQuery1MENGE1: TBCDField;
SQLQuery1PFAND1: TBCDField;
SQLQuery1PFANDARTIKEL1: TSmallintField;
SQLQuery1SCHANKARTIKEL1: TSmallintField;
SQLQuery1SETARTIKEL1: TSmallintField;
SQLQuery1WARENGRUPPE1: TLongintField;
SQLTransaction1: TSQLTransaction;
procedure DBNavigator1Click(Sender: TObject; Button: TDBNavButtonType);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormShow(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.FormShow(Sender: TObject);
begin
IBConnection1.connected := true;
SQLQuery1.active := true;
DBGrid1.setfocus;
end;

procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TDBNavButtonType);
begin
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
SQLTransaction1.commit;
SQLQuery1.close;
end;

initialization
{$I unit1.lrs}

end.
Zeiterfassung, einfach gerechter!

Kuster Peter
Beiträge: 205
Registriert: So 2. Dez 2007, 20:47
OS, Lazarus, FPC: Windows XP Lazarus immer neueste Version
CPU-Target: xxBit
Wohnort: Schweiz

Daten gehen verloren

Beitrag von Kuster Peter »

Hallo Peter

Genau das gleiche Problem hatte ich sowie auch Alfred. Die Lösung ist folgende:

Im OnClose folgende Befehle einfügen:

SQLQUERY1.UpdateMode := upWhereChanged;
SQLQUERY1.ApplyUpdates;
SQLTransaction1.Commit;
SQLQUERY1.close;

Wenn nun das PRG zusammenbricht oder ein Stromunterbruch ist und das PRG nicht korrekt geschlossen wird, dann sind die Daten weg.

Ist leider ein grosser Bug im Lazarus.

Peter

petermännchen
Beiträge: 92
Registriert: So 26. Aug 2007, 20:35
OS, Lazarus, FPC: Win7, Laz 1.2.6, FPC 2.6.4, SVN 33306, ZEOS 7.1.4
CPU-Target: 32Bit
Wohnort: Helmstedt
Kontaktdaten:

Beitrag von petermännchen »

@Peter

danke für die Hilfestellung.
Ob das eine Fehler ist möchte ich nicht bejahen. Wenn ein PC abstürzt mit aktiver Transaction, dann ist in Delphi auch alles weg.

Abhilfe:
procedure TForm1.SQLQuery1AfterPost(DataSet: TDataSet);
begin
SQLQuery1.applyupdates; //updatemode in den Propertys gesetzt.
SQLTransaction1.commitretaining;
end;

Klappt jetzt auch in Lazarus wunderbar, läßt allerdings kein Rollback zu. Hier muß der Entwickler entscheiden zwischen Sicherheit und Funktionen. Ich verzichte lieber auf die Rollback- Funktion.

Mögliche Verbesserung: eigenes Fehlerhandling (Mainform!) und in dieser Routine die Transaction beenden.
Gegen Stromausfall hilft USV
Gegen Hardwarecrash hilft.. nichts.

Unterschied zu Delphi: applyupdates muß manuell gesetzt werden.

Was mich etwas verunsichert ist, das ich die Transaction nicht mit intransaction abfragen kann. Aber ein commit ohne Transaction bringt ja keine Fehler.

Gruß

Peter
Zeiterfassung, einfach gerechter!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: Daten gehen verloren

Beitrag von af0815 »

Kuster Peter hat geschrieben:Ist leider ein grosser Bug im Lazarus.


Ich würde sagen, es sit dann erst ein Bug, wenn du zuerst wirklich gesagt hast was du willst.

Bei Lazarus ist einfach die Eigenverantwortung höher. Bei Delphi hat die Komponente greaten was du eigentlich machen willst, Lazarus verlangt da ganz einfach eine schlüssigere Einstellung/Programmierung. Wenn du die Daten in der DB haben willst, solltest du wenigstens das mitteilen (ApplyUpdates) oder wirklich mit Transaktionen arbeiten. Genauso wie die Komponente wissen sollte, WIE sie das Updatestatement (auch delete oder insert) aus deinem SQL Statement erraten soll.

Bezüglich Daten weg - Wenn eine transaktion nicht abgeschlossen werden kann, so hat sie die verdammte Pflicht, alles was nicht commited wurde wegzuschmeissen UND die DB in einem konsistenten Zustand zu halten ! Eine Stromunterbrechung oder ein Versagen des programmes ist kein 'normaler' Zustand. Das sage ich eher, warum hast du nicht so schnell wie möglich comittet.

Ist nicht Kritik, soll nur zum denken anregen :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

ZEOS geht definitiv im aktuellen trunk.

Vor dem kompilieren lösche ich allerdings immer das gesamte ZEOS-Verzeichnis und entpecke es aus dem Archiv neu. Danach klappt ein 'Lazarus neu erstellen...' mit ZEOS wunderbar.
Johannes

piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

Beitrag von piper62 »

Hallo,

gerade wegen der Transaktionssicherheit sind wir auf Zeos gegangen. Ich kann es nur empfehlen.

Probier mal über eine zweites Query Objekt per ".ExecSQL" ein "COMMIT" oder ein "ROLLBACK" zu schicken.
Das hat bei uns ein paar Dinge gut gelöst. Über eine solche zweite Verbindung machen wir auch ein "select * where id=4711 for update" um einen Datensatz für ein Update zu sperren. Da hatte es einige Probleme gegeben aber über diesen Weg geht es einwandfrei.
Allerdings arbeiten wir auf MySQL5 mit InnoDB Storage Engine.

Gruss,
Tibor

Antworten