Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi FB 2.0 und IBDAC Datenzugriff (https://www.delphipraxis.net/113690-fb-2-0-und-ibdac-datenzugriff.html)

hanspeter 13. Mai 2008 07:09

Datenbank: FB2.0 • Zugriff über: IBDAC

FB 2.0 und IBDAC Datenzugriff
 
Hallo,
ich habe einen eigenartigen Effekt, wo ich noch nicht klar ist, wonach ich suchen soll.

Ich greife über IBDAC auf eine FB 2.0 Datenbank zu.

Mit

Delphi-Quellcode:
Select ID,NR,ABTLG,BEZEICHNUNG FROM ANWENDERDAT
lese ich eine Datenmenge aus und zeige diese in einem Grid an (maximal ca. 20 bis 30 Datensätze).

Jetzt will ich die Datensätze einzeln verarbeiten.

Delphi-Quellcode:
Query.SQL.Text := 'Select NR,ABTLG,BEZEICHNUNG FROM ANWENDERDAT WHERE ID=:id';
Query.Prepare;
Query.ParambyName('id').asInteger := ID;
Query.Open;
Die Anweisung

Delphi-Quellcode:
Nr := Query.FieldbyName('NR').asInteger
gibt 0 zurück, obwohl dort in der Datenbank ein anderer Wert (z.B. 1) steht.
Im Grid ist der korrekte Wert angezeigt.
Abtlg und Bezeichnung geben die korrekten Werte zurück.

Leider kann man den Inhalt der Felder im Debugger nicht anzeigen. (Speicherschutzverletzung)
Dieser Delphi-Bug soll aber wohl mit dem neuen Update behoben sein?
Hat wer so einen Effekt mit IBDAC schon mal gehabt?

Für einen Tip dankbar.
Gruß
Peter

mkinzler 13. Mai 2008 07:11

Re: FB 2.0 und IBDAC Datenzugriff
 
Welcher Wert bekommst du wenn du auf .Value zugreifst?

hanspeter 13. Mai 2008 07:25

Re: FB 2.0 und IBDAC Datenzugriff
 
Zitat:

Zitat von mkinzler
Welcher Wert bekommst du wenn du auf .Value zugreifst?

Habe ich noch nicht probiert.
Muss ich heute abend mal versuchen.

Der Effekt tritt aber bei einigen Anweisungen auf und da es sich teilweise um älteren Code handelt,
muss es auch schon mal gegangen sein.

Gruß
Peter

mkinzler 13. Mai 2008 07:27

Re: FB 2.0 und IBDAC Datenzugriff
 
Grundsätzlich sollte man aber dort wo keine explizite Typkonvertierung der felder notwendig ist, auf die .as<Typ> verzichten

hanspeter 13. Mai 2008 07:41

Re: FB 2.0 und IBDAC Datenzugriff
 
Zitat:

Zitat von mkinzler
Grundsätzlich sollte man aber dort wo keine explizite Typkonvertierung der felder notwendig ist, auf die .as<Typ> verzichten

Warum?
Das ist nicht ganz einzusehen.
asInteger kapselt doch auch nur
Delphi-Quellcode:
result := Integer(Value)

mkinzler 13. Mai 2008 07:43

Re: FB 2.0 und IBDAC Datenzugriff
 
Nein es verändert den Typ der abgeleiteten TField-Klasse

hoika 13. Mai 2008 07:48

Re: FB 2.0 und IBDAC Datenzugriff
 
Hallo,

welchen Typ hat NR denn überhaupt ,
normales Integer oder Int64 (BigInt) ?


Heiko

hanspeter 13. Mai 2008 07:56

Re: FB 2.0 und IBDAC Datenzugriff
 
Zitat:

Zitat von hoika
Hallo,

welchen Typ hat NR denn überhaupt ,
normales Integer oder Int64 (BigInt) ?


Heiko

ID Integer
Nr Integer
Abtlg Integer
Bezeichnung VARCHAR(80)

hoika 13. Mai 2008 12:32

Re: FB 2.0 und IBDAC Datenzugriff
 
Hallo,

wenn du den obigen Code für den DB-Grid benutzt
also nur den einen Wert anzeigst,
steht dort dann wirklich 0 in der Spalte NR ?


Heiko

hanspeter 13. Mai 2008 13:52

Re: FB 2.0 und IBDAC Datenzugriff
 
Zitat:

Zitat von hoika
Hallo,

wenn du den obigen Code für den DB-Grid benutzt
also nur den einen Wert anzeigst,
steht dort dann wirklich 0 in der Spalte NR ?
Heiko

Nein, dann stehen dort die richtigen Werte.

Ich arbeite mit Offline - Datenmengen.
Dazu habe ich ein Tool gebaut, welches mir aus einer Query ein ADV - Stringgrid füllt.

Beispiel:

Delphi-Quellcode:
 // Spalten für das Grid definieren Parameter: Feldbezeichner , Spaltentitel, Spaltenbreite
Grid.Add('ID','',0);     // Die ID Spaltenbreite 0 -> verborgen
Grid.Add('NR','Nr', 32); // Feldname NR Spaltentitel Nr. Spaltenbreite 32
Grid.Add('BEZEICH','Bezeichnung des Vorgangs',134);

Starttransaction;
Grid.LoadFromTable('ANWENDERDAT'); // Generiert automatisch eine SQL Abfrage und arbeitet diese ab.
Commit;
Im eigentlichen Programm lese ich dann aus dem Grid die ID aus und verarbeite die Sätze einzeln.

Der Unterschied ist, das zum Füllen des Grid eine Datenmenge abgefragt wird und für die
Einzelverarbeitung erfolgt die Abfrage mit WHERE und einem Parameter.
(Die Verarbeitung wird über einen Schalter aktiviert.)

Delphi-Quellcode:
Query.SQL.Text := 'Select NR,ABTLG,BEZEICHNUNG From ANWENDERDAT WHERE ID=:id';
Query.Prepare;
StartTransaction;
for i := 1 to Grid.Count-1 do
begin
  ID := Grid.asInteger('ID',i);          // Grid auslesen SQLFeldname, Row
  Query.ParambyName('ID').asinteger := ID;

...

Commit;
Die aufbereitete Abfrage in IBExpert kopiert, bringt das gewünschte Ergebnis.

Der Code selbst läuft in einem Plugin (HYDRA3.0).
Connection und Transaction sind in dem Plugin definiert.
Die Programmconnection übergebe ich über ein Interface und erzeuge mit Connection.AssignConnect(..
einen Clone der Verbindung.
An dieser Stelle will ich heute abend mal experimentieren.

Gruß
Peter


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:14 Uhr.
Seite 1 von 2  1 2      

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