AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Transactionen

Ein Thema von clock50 · begonnen am 24. Aug 2009 · letzter Beitrag vom 25. Aug 2009
Antwort Antwort
clock50

Registriert seit: 9. Nov 2005
Ort: Derenburg
183 Beiträge
 
Delphi 5 Professional
 
#1

Transactionen

  Alt 24. Aug 2009, 01:55
Datenbank: Firebird • Version: 2.0 • Zugriff über: IBX
Hallo Leute,

ich habe mich mal über IBX und Firebird belesen. Zugreifen ändern einfügen geht alles nur mit zwei oder meheren Progammen auf eine DB das will immer noch nicht so recht.
Ich habe alle Ratschläge versucht umzusetzen. Aber ich komme noch nicht so recht klar.
Also habe ich für jeden zugriff ob lesen, einfügen oder ändern jedes mal StartTransaction nach lesen ein Rollback nach ändern oder einfügen ein Commit.
jetzt bekomme ich immer wieder die Meldung Transaction ist aktiv oder Transaction ist nicht activ obwohl direkt vor dem IBQuery ... ein StartTransaction steht.

Ich benutze keine Datasource, ich lade alles in listen und lasse es über Listview anzeigen.

Delphi-Quellcode:
procedure TDM.sSql(Sql : String);
begin
  IBTransaction1.StartTransaction;
  IBSQL1.SQL.Clear;
  IBSQL1.SQL.Text := Sql;
  IBSQL1.ExecQuery;
  IBTransaction1.Commit;
end;

procedure TDM.F2Anzeige(ID : Integer);
begin
 if not Assigned(Form2) then exit;
 if Form2.WindowState = wsMinimized Then exit;

 IBTransaction1.StartTransaction;
 IBQuery1.Open;
 IBQuery1.Locate('ID', kunden[id].id, [loCaseInsensitive]);
 k_ID := DM.IBQuery1ID.AsInteger;
 Form2.JvComboBox1.Text := DM.IBQuery1ANREDE.AsString;
 Form2.JvEdit1.Text := DM.IBQuery1VORNAME.AsString;
 Form2.JvEdit2.Text := DM.IBQuery1NAME.AsString;
 Form2.JvComboBox2.Text := DM.IBQuery1LAND.AsString;
 Form2.JvEdit3.Text := DM.IBQuery1PLZ.AsString;
 Form2.JvEdit4.Text := DM.IBQuery1ORT.AsString;
 Form2.JvEdit5.Text := DM.IBQuery1STRASSE.AsString;
 Form2.JvEdit6.Text := DM.IBQuery1TEL.AsString;
 Form2.JvEdit7.Text := DM.IBQuery1FAX.AsString;
 Form2.JvEdit8.Text := DM.IBQuery1MAIL.AsString;
 Form2.JvEdit9.Text := DM.IBQuery1KNR.AsString;
 IBQuery1.Close;
 IBTransaction1.Rollback;
end;

function TDM.Kundeneu : integer;
begin
 IBTransaction1.StartTransaction;
 Abfrage.Close;
 Abfrage.SQL.Clear;
 Abfrage.SQL.Add('SELECT * FROM KUNDEN ORDER BY CAST(KNR AS INTEGER) ASC');
 Abfrage.Open;
 Abfrage.Last;
 Result := Abfrage.FieldByName('KNR').AsInteger + 1;
 IBTransaction1.Rollback;
end;

procedure TDM.DKunden(SQL : String);
var a : integer;
    itm : TListItem;
begin
 IBTransaction1.StartTransaction;
 if SQL <> 'Then
  begin
  IBQuery1.Close;
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Add(sql);
  end;
 IBQuery1.Open;
 SetLength(Kunden, 1);
 IBQuery1.First;
 While not IBQuery1.Eof do
  begin
  setlength(kunden, length(kunden)+1);
  a := length(kunden)-1;
  kunden[a].id := IBQuery1ID.AsInteger;
  kunden[a].knr := IBQuery1KNR.AsInteger;
  kunden[a].name := IBQuery1NAME.AsString;
  kunden[a].vorname := IBQuery1VORNAME.AsString;
  IBQuery1.Next;
  end;
  IBQuery1.Close;
  IBTransaction1.Rollback;
end;

procedure TDM.AKunden(ListView : TJvListView);
var a : integer;
    itm: TListItem;
begin
 ListView.Items.Clear;
 for a := 1 to Length(kunden)-1 do
  begin
  itm := ListView.Items.Add;
  itm.Caption := IntToStr(kunden[a].id);
  itm.SubItems.Add(kunden[a].vorname);
  itm.SubItems.Add(kunden[a].name);
  end;
 ListView.Items[ListView.Items.Count-1].MakeVisible(True);
 if a < 0 then ListView.ItemIndex := ListView.Items.Count-1 else ListView.ItemIndex := a;
 F2Anzeige(a);
 unit3.KuNr := IntToStr(kunden[a].knr);
 unit4.KuNr := IntToStr(kunden[a].knr);
end;
Thomas
Man muß nicht alles wissen, man muß nur wissen in welchem Buch es geschrieben steht!
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Transactionen

  Alt 24. Aug 2009, 06:03
Zitat von clock50:
Ich benutze keine Datasource, ich lade alles in listen und lasse es über Listview anzeigen.
Warum eigentlich nicht? Ist das zu einfach?
Mir fällt auserdem auf, dass du dein Datenmodul und das Formular auf sehr ungünstige Weise
vermischt.
In procedure TDM.F2Anzeige(ID : Integer) kennt das Datenmodul das Formular (das ist schlecht)
und das Fomular kennt das Datenmodul (das ist in Ordnung).
Ehrlich gesagt ist die Procedure eine einzige Katastrophe. Nicht mal das Ergebnis von Locate wird überprüft.
Wenn du z.B. TForm2.JvEdit5 einen sinnvollen Namen geben möchtest, musst du gleich an zwei Stellen ändern.

Ich schlage vor, TDatasource und TEdit Objekte zu benützen.
Dadurch wird die Kopplung zwischen Formular und Datenmodul automatisch verringert und ausserdem ist Funktionalität für die du stundenlang programmieren müsstest schon vorhanden.

Um eine neue Kundennummer zu ermitteln, brauchst du nicht alle Daten abrufen und diese dann auch noch sortieren.
Delphi-Quellcode:
function TDM.Kundeneu : integer;
begin
  Abfrage.SQL.Add('SELECT MAX(KNR)+1 FROM KUNDEN');
  Abfrage.Open;
  result := Abfrage.Fields[0].AsInteger;
  Abfrage.Close;
end;
Ansonsten würde ich keinerlei Transactions benützen, sondern alles so einfach wie möglich halten.
Transactions werden erst dann wichtig, wenn z.B. mehrere Arbeitsstationen auf die gleichen Daten zugreifen oder Änderungen an mehreren Tabellen ganz oder gar nicht vorgenommen werden müssen.
fork me on Github
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Transactionen

  Alt 24. Aug 2009, 06:37
Eine neue Kundennummer sollte aber über einen Generator plus GenID() erfolgen
Markus Kinzler
  Mit Zitat antworten Zitat
clock50

Registriert seit: 9. Nov 2005
Ort: Derenburg
183 Beiträge
 
Delphi 5 Professional
 
#4

Re: Transactionen

  Alt 24. Aug 2009, 06:46
Ich möchte ja grundsätzlich verstehen wie das mit mehrern anwendungen auf eine datenbank ist. die Datasource habe ich weggelassen da die Transaction sonst offen bleiben muß und eine Andere Anwendung nicht die daten bearbeiten kann.
Thomas
Man muß nicht alles wissen, man muß nur wissen in welchem Buch es geschrieben steht!
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Transactionen

  Alt 24. Aug 2009, 09:43
Hallo,

jeder hat mal angefangen,
also nicht immer gleich losschreien


Zitat:
jetzt bekomme ich immer wieder die Meldung Transaction ist aktiv
Die Meldung ist doch aussagekräftig, oder ?
Irgendwo wird die Transaktion doch nicht geschlossen

Dein Code

Delphi-Quellcode:
procedure TDM.sSql(Sql : String);
begin
  IBTransaction1.StartTransaction;
  IBSQL1.SQL.Clear;
  IBSQL1.SQL.Text := Sql;
  IBSQL1.ExecQuery;
  IBTransaction1.Commit;
end;

Mein Code:

Delphi-Quellcode:
procedure TDM.sSql(Sql : String);
begin
  IBTransaction1.StartTransaction;
  try
    try
      IBSQL1.SQL.Clear;
      IBSQL1.SQL.Text := Sql;
      IBSQL1.ExecQuery;
    except
      IBTransaction1.RollBack;
    end;
  finally
    if IBTransaction1.InTransaction then
    begin
      IBTransaction1.Commit;
    end;
  end;
end;
Das begin/end beim Commit erlaubt es übrigens,
einen Breakpoint zu setzen (bei der Fehlersuche ganz hilfreich)

Nutze als try/except, try/finally wie ich.


Eine letzte Sache, die DataBases/Transaktionen sollten nicht im Object-Inspector
geöffnet/aktiv gesetzt werden.



Heiko
Heiko
  Mit Zitat antworten Zitat
clock50

Registriert seit: 9. Nov 2005
Ort: Derenburg
183 Beiträge
 
Delphi 5 Professional
 
#6

Re: Transactionen

  Alt 24. Aug 2009, 21:38
Hallo Heiko,

das hat mich ein ganze Stück weiter gebracht, Danke.

Aber nur mal so am Rande : Ist es überhaupt möglich wenn man TDatasource verwendet "gleichteitige" zugriffe auf eine DB mit IBX oder ZEOS. Es ist ja immer geöffnet wenn man DBGrid auch noch hat und die Daten permanet angezeigt werden?
Thomas
Man muß nicht alles wissen, man muß nur wissen in welchem Buch es geschrieben steht!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Transactionen

  Alt 24. Aug 2009, 21:40
Du mustt die datenmengen halt entsprechend auffrischen (.Refresh). Z.B. durch Events
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Transactionen

  Alt 25. Aug 2009, 08:54
Hallo,

oder ein TClientDataSet für die DBGrid-Anzeige verwenden.
Ich persönlich benutze DBGrid gar nicht,
sondern ein normales StringGrid.


Heiko
Heiko
  Mit Zitat antworten Zitat
clock50

Registriert seit: 9. Nov 2005
Ort: Derenburg
183 Beiträge
 
Delphi 5 Professional
 
#9

Re: Transactionen

  Alt 25. Aug 2009, 12:46
Ich verwende sehr gerne ListView weil es den Inhalt nur verdeckt wenn er für dei zelle zugroß ist und wenn man mit der maus darüber geht zeigt er den rest in Hit ohne eine zeile code.
Thomas
Man muß nicht alles wissen, man muß nur wissen in welchem Buch es geschrieben steht!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz