AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird Fehlerhaftes Returning

Firebird Fehlerhaftes Returning

Ein Thema von Pro_RJ · begonnen am 8. Mär 2012 · letzter Beitrag vom 8. Mär 2012
Antwort Antwort
Seite 1 von 3  1 23   
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#1

Firebird Fehlerhaftes Returning

  Alt 8. Mär 2012, 11:57
Datenbank: FireBird • Version: 2.1.X • Zugriff über: IBX
Hallo zusammen,

Ich habe ein mekrwürdiges problem mit dem Returning Wert beim einfügen in eine Tabelle.

Ich habe 2 Kunden (hier ist das Problem verstärkt aufgetreten).
Wir verwenden den Firebird in der Version 2.1.2 bzw. 2.1.3 in der Classic-Installation (sowohl 32 bit als auch 64 bit)

ich habe eine Tabelle mit einem PrimaryKey (Zaehler) dieser wird immer per BeforeInsert-Trigger begelgt.Das funktioniert ich immer korrekt.
allerdings kommt ab und zu folgendem Problem.

Ich setze folgendes statement über ein IBSQL-Komponente ab

Delphi-Quellcode:
IBSQL.close
IBSQL.sql.clear;
IBSQL.sql.text := 'Insert into TBL (Nr) values (1) Returning Zaehler';
IBSQL.ExecSQL;
IBSQL.fieldbyname('Zaehler').asInteger;
Der Datensatz wird auch korrekt in der Db angelegt und hat auch einen gültigen Zaehler.
Select Zaehler from TBL where Nr = 1 Alles OK und im Feld Zaehler steht der richtige und gültige Wert.
Wenn ich allerdings auf IBSQL.fieldbyname('Zaehler').asInteger zugreife hat dieses Feld 0 obwohl der Datensatz in der Tabelle einen gültigen Zaehler hat. dies Habe ich per SQL-Monitor geprüft und ist auch ok.

Das komische an der Sache ist, das dieses Problem nur sehr sehr unregelmäßig auftritt.
Es werden ca 1,5 mio Daten pro Nacht eingefügt und dieser Fehler tritt etwar 3-4 Datensätzen im Monat auf. (Backup/Restore wird auf Kundenwunsch jede Woche durchgeführt).
Ein Transactionsfehler kann ich hier zu 100% ausschließen. Zumal nach einem "Commit" ja beim zurgiff auf das Feld ein Fehler ausgelöst würde (Feld nicht gefunden).


Kennt noch jemand das Problem oder sogar eine Lösung? ich wäre für jeden tipp Dankbar da ich schon sehr lange an dem Problem arbeite und einfach keinen lösungsansatz habe.
Das schwierige ist, das ich das Problem bei mir auf dem PC nicht nachfollziehen kann.Selbst mit der gleichen DB,gleiches Programm,gleiche Daten,gleichen Server. Alles ist identisch und ich bekomme den Fehler einfach nicht hin.
Danke schonmal im Vorraus
  Mit Zitat antworten Zitat
Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#2

AW: Firebird Fehlerhaftes Returning

  Alt 8. Mär 2012, 12:05
ist AsInteger überhaupt richtig?
Wie ist das Feld in FB deklariert?
Wie sieht dein Trigger aus?
Hast du noch weitere Trigger in der Tabelle?
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#3

AW: Firebird Fehlerhaftes Returning

  Alt 8. Mär 2012, 12:14
das Feld ist ein Integer.
der Trigger :

Delphi-Quellcode:
CREATE trigger zaehlerTBL for TBL
active before insert position 0
AS
BEGIN
  NEW.ZAEHLER = GEN_ID(GENTBL,1);
END
Es sind noch andere Trigger in Tabelle vorhanden, diese Belegen aber das Feld nicht.
Das Feld ist ja auch richtig Belegt es kommt nur beim Einfügen im Statement nicht zurück.
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#4

AW: Firebird Fehlerhaftes Returning

  Alt 8. Mär 2012, 12:19
Ich habe IBX nicht im Einsatz, aber probier mal:
Delphi-Quellcode:
IBSQL.close
IBSQL.sql.clear;
IBSQL.sql.text := 'Insert into TBL (Nr) values (1) Returning Zaehler';
IBSQL.ExecSQL;
IBSQL.ParamByName('Zaehler').asInteger;
Es könnte auch gut sein, dass IBX einfach die RETURNING Klausel von Firebird nicht unterstützt.
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#5

AW: Firebird Fehlerhaftes Returning

  Alt 8. Mär 2012, 12:27
Doch doch, diese Funktion wird unterstützt und Fuktioniert ja auch in 99,999% aller Fälle. nur eben ab und zu bringt diese Funktion eben kein Ergebnis.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Firebird Fehlerhaftes Returning

  Alt 8. Mär 2012, 12:29
Hast du gesehen, dass tsteinmaurer "ParamByName" und nicht "FieldByName" benutzt hat?

Bei mir haben die Rückgabe-Parameter manchmal allerdings komische Namen, weswegen ich sie immer über den Index anspreche -> Params[ParamCount-1].AsInteger
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#7

AW: Firebird Fehlerhaftes Returning

  Alt 8. Mär 2012, 12:49
Das Problem ist nicht, das die Funktion IBSQL.FieldByName('Zaehler').asInteger nicht geht. das Problem liegt darin, das der Server den Wert nicht an den Client übermittelt, Der Server ermittelt den Wert richtig und schreibt ihn auch in den Richtigen Datensatz in das Richtige Feld. Das ist ja auch alles IO. nur das Das Feld im Anschluss nicht an den Client übermittelt wird. Das problem ist im übrigen auch nicht nur beim PrimayKey sondern auch bei anderen Felder, die Serverseitig richtig belegt sind aber eben nicht an den Client übermittelt werden
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Firebird Fehlerhaftes Returning

  Alt 8. Mär 2012, 12:55
Das Problem ist nicht, das die Funktion IBSQL.FieldByName('Zaehler').asInteger nicht geht. das Problem liegt darin, das der Server den Wert nicht an den Client übermittelt,
Und da bist Du dir absolut sicher (SQL-Monitor usw.)? Ich habe die 2.1.1 im Einsatz und auch eine Stelle mit Returning - damit hatte ich bei meinen Kunden noch kein Problem (das sind einige tausend Installationen die diese Funktion nutzen).

GRüße
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#9

AW: Firebird Fehlerhaftes Returning

  Alt 8. Mär 2012, 13:00
Da bin ich mir absolut relativ sicher da der Datensatz Serverseitig den richtigen Zähler hat.

ich kann das ganze sehr einfach und sicher prüfen:
Es handelt sich hier um eine schnittstelle. diese Daten werden im 1. Schritt in eine Zwischentabelle gespeichert. "TBL_A". Anschliesend wird diese Eingefügte Datenmenge in einer Schleife durchgearbeitet und diese erzeugt zusätzliche Daten "TBL_B"

der Ablauf ist (schematisch Dargestellt) folgender:
Delphi-Quellcode:
Transaction Starten;
While not TBL_A.Eof do
Begin
  INC(I);
  IBSQL.CLose;
  IBSQL.SQL.Text := 'Insert into TBL_B(Nr) values (' + IntToStr(TBL_a.FieldByName('Zaehler').asINteger) + ') returing Zaehler';
  IBSQL.Execsql;

  Zaehler := IBSQL1.FIeldByName('Zaehler').asNteger;
  IBSQL.CLose;
  IBSQL.SQL.Text := 'Update TBL_A set FremdID = ' + IntToStr(Zaehler) + ' where Zaehler = ' + IntToStr(TBL_a.FieldByName('Zaehler').asINteger);
  IBSQL.Execsql
  TBL_A.Next;
end;
Transaction Commit;
Das heist das es pro TBL_A Datensatz auch einen TBL_B Datensatz geben muss (1=1 Verbindung).
In TBL_A speichere ich mir den neuen Zaehler aus TBL_B und in TBL_B steht der Zaehler aus TBL_A.

Jetzt ist ab und zu mal das Problem, das in TBL_A UND TBL_B ein Datensatz vorhanden ist. In TBL_B steht ein Zaehler aus TBL_A aber in TBL_A ist das Feld Fremd_ID 0 und das Kann einfach nicht sein.

Geändert von Pro_RJ ( 8. Mär 2012 um 13:08 Uhr)
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#10

AW: Firebird Fehlerhaftes Returning

  Alt 8. Mär 2012, 13:02
Ich selbst hatte damit auch noch nie Probleme, verwende allerdings IBObjects bzw. IBDAC.

@Lemmy: Einige Tausende Installationen? Bist du Mitglieder der Foundation? SCNR.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:32 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