Firebird

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.

Firebird

Beitragvon petermännchen » 7. Mai 2008, 18:54 Firebird

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
petermännchen
 
Beiträge: 89
Registriert: 26. Aug 2007, 19:35
Wohnort: Helmstedt
OS, Lazarus, FPC: Win7, Laz 0.9.30.2 beta, FPC 2.4.4, SVN 33306, ZEOS 6.6.6 | 
CPU-Target: 32Bit
Nach oben

Beitragvon knight » 7. Mai 2008, 19:30

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

knight
knight
 
Beiträge: 779
Registriert: 13. Sep 2006, 21:30

Beitragvon petermännchen » 7. Mai 2008, 20:02

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!
petermännchen
 
Beiträge: 89
Registriert: 26. Aug 2007, 19:35
Wohnort: Helmstedt
OS, Lazarus, FPC: Win7, Laz 0.9.30.2 beta, FPC 2.4.4, SVN 33306, ZEOS 6.6.6 | 
CPU-Target: 32Bit
Nach oben

Beitragvon af0815 » 7. Mai 2008, 20:28 Re: Firebird

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).
af0815
 
Beiträge: 2227
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L 1.2.x FPC 2.6.x) SVN | 
CPU-Target: 32Bit/64Bit
Nach oben

Beitragvon petermännchen » 8. Mai 2008, 10:11

@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!
petermännchen
 
Beiträge: 89
Registriert: 26. Aug 2007, 19:35
Wohnort: Helmstedt
OS, Lazarus, FPC: Win7, Laz 0.9.30.2 beta, FPC 2.4.4, SVN 33306, ZEOS 6.6.6 | 
CPU-Target: 32Bit
Nach oben

Beitragvon af0815 » 8. Mai 2008, 11:00

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).
af0815
 
Beiträge: 2227
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L 1.2.x FPC 2.6.x) SVN | 
CPU-Target: 32Bit/64Bit
Nach oben

Beitragvon knight » 8. Mai 2008, 12:17

- laszdatadesktop läßt sich nicht installieren

Dieses Package benötigt FPC 2.3.1

knight
knight
 
Beiträge: 779
Registriert: 13. Sep 2006, 21:30

Beitragvon petermännchen » 9. Mai 2008, 08:40

@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!
petermännchen
 
Beiträge: 89
Registriert: 26. Aug 2007, 19:35
Wohnort: Helmstedt
OS, Lazarus, FPC: Win7, Laz 0.9.30.2 beta, FPC 2.4.4, SVN 33306, ZEOS 6.6.6 | 
CPU-Target: 32Bit
Nach oben

Beitragvon knight » 9. Mai 2008, 09:22

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
knight
 
Beiträge: 779
Registriert: 13. Sep 2006, 21:30

Beitragvon petermännchen » 9. Mai 2008, 09:46

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!
petermännchen
 
Beiträge: 89
Registriert: 26. Aug 2007, 19:35
Wohnort: Helmstedt
OS, Lazarus, FPC: Win7, Laz 0.9.30.2 beta, FPC 2.4.4, SVN 33306, ZEOS 6.6.6 | 
CPU-Target: 32Bit
Nach oben

Beitragvon Kuster Peter » 9. Mai 2008, 12:53 Daten gehen verloren

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
Kuster Peter
 
Beiträge: 198
Registriert: 2. Dez 2007, 20:47
Wohnort: Schweiz
OS, Lazarus, FPC: Windows XP Lazarus immer neueste Version | 
CPU-Target: xxBit
Nach oben

Beitragvon petermännchen » 9. Mai 2008, 14:29

@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!
petermännchen
 
Beiträge: 89
Registriert: 26. Aug 2007, 19:35
Wohnort: Helmstedt
OS, Lazarus, FPC: Win7, Laz 0.9.30.2 beta, FPC 2.4.4, SVN 33306, ZEOS 6.6.6 | 
CPU-Target: 32Bit
Nach oben

Beitragvon af0815 » 11. Mai 2008, 21:49 Re: Daten gehen verloren

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).
af0815
 
Beiträge: 2227
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L 1.2.x FPC 2.6.x) SVN | 
CPU-Target: 32Bit/64Bit
Nach oben

Beitragvon monta » 19. Mai 2008, 18:53

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
monta
 
Beiträge: 2932
Registriert: 9. Sep 2006, 17:05
Wohnort: Dresden
OS, Lazarus, FPC: Winux (L trunk FPC trunk) | 
CPU-Target: 64Bit
Nach oben

Beitragvon piper62 » 21. Mai 2008, 23:12

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
piper62
 
Beiträge: 131
Registriert: 5. Apr 2008, 16:57
Wohnort: Ulm
OS, Lazarus, FPC: Debian Etch, Xubuntu 8.04, MacOS 10.5 (0.9.26.1 FPC 2.2.4) | 
CPU-Target: 32Bit
Nach oben

• Themenende •

Zurück zu Datenbanken



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

porpoises-institution
accuracy-worried