Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi INSERT INTO parameterisiert funktioniert nicht (https://www.delphipraxis.net/138987-insert-into-parameterisiert-funktioniert-nicht.html)

Mackhack 21. Aug 2009 03:31

Datenbank: FB • Version: 2.1 • Zugriff über: IB

INSERT INTO parameterisiert funktioniert nicht
 
Hallo DPler,

weis jemand warum dieser Code mir 2 Probleme bereitet?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  IBDatabase1.Connected := true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  IBQuery1.Transaction.StartTransaction;
  try
    IBQuery1.SQL.Text := 'SELECT * FROM Test';
    IBQuery1.Open;

    while not IBQuery1.Eof do
    begin
      ListBox1.Items.Add(IBQuery1.Fields[0].AsString);
      IBQuery1.Next;
    end;

    IBQuery1.Close;

  finally
    IBQuery1.Transaction.Rollback;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  IBQuery1.Active := False;
  IBQuery1.SQL.Text := 'INSERT INTO Test(acol, bcol) VALUES(:acol, :bcol)';
  IBQuery1.ParamByName('acol').AsInteger := 70001;
  IBQuery1.ParamByName('bcol').AsString := 'Tabby';
  ShowMessage(IBQuery1.SQL.Text);
  IBQuery1.ExecSQL;
  IBQuery1.Active := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  IBDatabase1.Connected := false;
end;
Als erstes Funktioniert das Einfuegen in die DB nicht und zum zweiten wenn ich auf Button2 klicke bekomme ich den Fehler "Transaction is active" und weis nicht wirklich was damit anzufangen.

Vlt. kann mir jemand helfen mit dem Beispielcode umzugehen?

Danke!

sx2008 21. Aug 2009 04:37

Re: INSERT INTO parameterisiert funktioniert nicht
 
Zitat:

Zitat von Mackhack
Als erstes Funktioniert das Einfuegen in die DB nicht

Bist du sicher? Wie hast du das überprüft?
Gibt es schon einen Datensatz mit [70001, 'Tabby'] ?
Hast die Tabelle weitere Felder mit dem Attribut NOT NULL dass das Einfügen verhindert?

Zitat:

Zitat von Mackhack
und zum zweiten wenn ich auf Button2 klicke bekomme ich den Fehler "Transaction is active"

Du greifst hier nur lesend auf die Daten zu.
Eine Transaction ist nicht notwendig. IBQuery1.Transaction.StartTransaction und IBQuery1.Transaction.Rollback weglassen.

Ausserdem: es ist besser jeweils eine eigene Query-Komponente für jede SQL-Anweisung zu benützen.
Dann kannst du das Property SQL im Objektinspektor festlegen und dann gleich prüfen
ob ggf. vorhandene Parameter den richtigen Datentp haben.
Falls zur Entwicklungszeit keine Verbindung zur Datenbank besteht kann der Datentyp der Parameter nicht ermittelt werden.
Bei Parametern ist der Datentyp sehr wichtig; ein falscher/unbekannter Datentyp ist der Hauptgrund für Probleme mit Parametern.

Mackhack 21. Aug 2009 05:36

Re: INSERT INTO parameterisiert funktioniert nicht
 
Hallo,

Zitat:

Zitat von sx2008
Zitat:

Zitat von Mackhack
Als erstes Funktioniert das Einfuegen in die DB nicht

Bist du sicher? Wie hast du das überprüft?
Gibt es schon einen Datensatz mit [70001, 'Tabby'] ?
Hast die Tabelle weitere Felder mit dem Attribut NOT NULL dass das Einfügen verhindert?

ich habe mit ISQL nachgeschaut und da ist kein 70001, Tabby vorhanden.

Zitat:

Zitat von sx2008
Zitat:

Zitat von Mackhack
und zum zweiten wenn ich auf Button2 klicke bekomme ich den Fehler "Transaction is active"

Du greifst hier nur lesend auf die Daten zu.
Eine Transaction ist nicht notwendig. IBQuery1.Transaction.StartTransaction und IBQuery1.Transaction.Rollback weglassen.

Ich weis zu meiner Schande noch nicht mal so recht warum ich das IBQuery1.Transaction.StartTransaction und IBQuery1.Transaction.Rollback drin habe. Ich bin recht neu was FB angeht so verzeiht mir bitte. Auch was die IB Kompos angeht so ist es mein aller erstes mal.

Zitat:

Zitat von sx2008
Ausserdem: es ist besser jeweils eine eigene Query-Komponente für jede SQL-Anweisung zu benützen.
Dann kannst du das Property SQL im Objektinspektor festlegen und dann gleich prüfen
ob ggf. vorhandene Parameter den richtigen Datentp haben.
Falls zur Entwicklungszeit keine Verbindung zur Datenbank besteht kann der Datentyp der Parameter nicht ermittelt werden.
Bei Parametern ist der Datentyp sehr wichtig; ein falscher/unbekannter Datentyp ist der Hauptgrund für Probleme mit Parametern.

Zur Entwicklungszeit ist die Verbindung zur DB getrennt. Was meinst du denn mit dem "Property SQL im OI festlegen"???

mkinzler 21. Aug 2009 05:37

Re: INSERT INTO parameterisiert funktioniert nicht
 
Wie sind die Transkationseinstellungen?

BTW ist der Cast des Parametertyps dann auch nicht nötig
Zitat:

Delphi-Quellcode:
IBQuery1.ParamByName('acol').AsInteger := 70001;

Delphi-Quellcode:
IBQuery1.ParamByName('acol').Value := 70001;
[Edit:
Zitat:

Zur Entwicklungszeit ist die Verbindung zur DB getrennt. Was meinst du denn mit dem "Property SQL im OI festlegen"???
Eine extra Kompo nehmen, in welche du das INSERT-Statement im Designer einträgst. Oder du mimmst gleich ein IBDataSet
]

Mackhack 21. Aug 2009 05:44

Re: INSERT INTO parameterisiert funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab mal n Screenshot angehaengt.

Und warum ist bei IBQuery1 ein gelbes dickes Fragezeichen?

//Edit: Ich hab jetzt ca. 12 mal 70001 drin da ich es zig mal wohl eingetragen habe. Ich hab dieses
Delphi-Quellcode:
IBQuery1.Transaction.StartTransaction;
und
Delphi-Quellcode:
IBQuery1.Transaction.Rollback;
rausgemacht und sie werden angezeigt.

Was genau machen denn diese 2 Zeilen?

mkinzler 21. Aug 2009 06:31

Re: INSERT INTO parameterisiert funktioniert nicht
 
.StartTransaction startet eine Transaktion und .RollBack verwirft die Änderungen
Da aber AutoCommit aktiviert ist ist dies nicht notwendig.
Bei Select-Abfragen ist es übrigens egal ob Commitet oder zurückgefahren wird.

alzaimar 21. Aug 2009 06:52

Re: INSERT INTO parameterisiert funktioniert nicht
 
Will mich nicht wirklich einmischen, aber bei meinem letzten und bisher einzigen Projekt mit FB und IB-Komponenten musste ich um jede, aber auch wirklich jede Anweisung in eine Transaktion kapseln, selbst ein SELECT musst so abgesetzt werden. Nur dann hat es funktioniert.

mkinzler 21. Aug 2009 06:55

Re: INSERT INTO parameterisiert funktioniert nicht
 
Die Autocommit-Option macht dies automatisch. Diese macht imho aber nur bei Selects Sinn.

Mackhack 21. Aug 2009 06:56

Re: INSERT INTO parameterisiert funktioniert nicht
 
Zitat:

Zitat von mkinzler
Die Autocommit-Option macht dies automatisch. Diese macht imho aber nur bei Selects Sinn.

Ich sehe das AutoCommit gar nicht. Wo ist denn das?

mkinzler 21. Aug 2009 06:58

Re: INSERT INTO parameterisiert funktioniert nicht
 
DefaultAction: TACommit


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 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