Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Daten mit DataSet in Datenbank schreiben (https://www.delphipraxis.net/88222-daten-mit-dataset-datenbank-schreiben.html)

fapsons 12. Mär 2007 07:28

Datenbank: Firebird • Version: 2.0 • Zugriff über: InterBase

Daten mit DataSet in Datenbank schreiben
 
Hallo Leute,

habe mir folgende Procedure um Daten aus meiner Firebirddatenbank auszulesen geschrieben.
Nun habe ich ne ganz einfache Frage. Wie muss ich eine zweite Procedure schreiben, um die gleichen Felder auf die Datenbank zu schreiben?

Vielen Dank schon mal.

-fapsons--


Delphi-Quellcode:
procedure Get_DB_Values;  // Auslesen Kundennamen aus DB
var i, j, k :Integer;
begin
   ...
   with D_DataModule.DataSet do
   begin
       SelectSQL.Clear;
       SelectSQL.Text := 'select upper(f.fname), f.fa_bez, f.faid from FIRMA f where f.haendler = ''N'' and f.stat  <> ''D'' order by 1 asc';
       Open;
   end;

   while not D_DataModule.DataSet.Eof do
   begin
       reg.customer[reg.Ac_ID].ID := D_DataModule.DataSet.FieldByName('FAID').Value;
       reg.Customer[reg.Ac_ID].Company := D_DataModule.DataSet.FieldByName('UPPER').Value;
       reg.Customer[reg.Ac_ID].CompanyType := D_DataModule.DataSet.FieldByName('FA_BEZ').Value;
       D_DataModule.DataSet.Next;
      ...      
   end;
   ...
   D_DataModule.DataSet.Close;

Hansa 12. Mär 2007 07:46

Re: Daten mit DataSet in Datenbank schreiben
 
Am besten so :

Delphi-Quellcode:
   with D_DataModule.DataSet do
   D_DataModule.DataSet.Edit;
   while not D_DataModule.DataSet.Eof do begin
      D_DataModule.DataSet.FieldByName('FAID').AsInteger;
      reg.customer[reg.Ac_ID].ID;     ...      
   end;
   D_DataModule.DataSet.Post;
   ...
   D_DataModule.DataSet.Close;
[/quote]

P.S.: das Value würde ich mir abgewöhnen. Habe z.B. jetzt nur geraten, ob es überhaupt um integer geht.

mkinzler 12. Mär 2007 07:51

Re: Daten mit DataSet in Datenbank schreiben
 
Zitat:

P.S.: das Value würde ich mir abgewöhnen. Habe z.B. jetzt nur geraten, ob es überhaupt um integer geht.
Kannst du das auch begründen?

bttb930 12. Mär 2007 08:28

Re: Daten mit DataSet in Datenbank schreiben
 
Zitat:

Zitat:

Zitat von Hansa
Am besten so :

Delphi-Quellcode:
   with D_DataModule.DataSet do
   D_DataModule.DataSet.Edit;
   while not D_DataModule.DataSet.Eof do begin
      D_DataModule.DataSet.FieldByName('FAID').AsInteger;
      reg.customer[reg.Ac_ID].ID;     ...      
   end;
   D_DataModule.DataSet.Post;
   ...
   D_DataModule.DataSet.Close;

P.S.: das Value würde ich mir abgewöhnen. Habe z.B. jetzt nur geraten, ob es überhaupt um integer geht.
Vergiss es, so läuft es nicht.

Erstmal frage ich mich, ob es überhaupt gehen würde. Schließlich ist das kein einfacher SELECT * sondern mit Funktionen. Zum anderen ÜBERSCHREIBST du die Zeilen einfahc (Edit) statt anzuhängen.

Besser ist:

Delphi-Quellcode:
var
  Query: TADOQuery;
...
Query := TADOQuery.Create(nil);
Query.Connection := ...;
Query.SQL.Text := 'INSERT INTO tabelle (feld1, feld2, ...) VALUES (:feld1, :feld2, ...)';
Query.Parameters.ParamByName('feld1').Value := ...;
...
Query.Execute;
Query.Free;
Oder alternativ:

Delphi-Quellcode:
var
  Query: TADOQuery;
...
Query := TADOQuery.Create(nil);
Query.Connection := ...;
Query.SQL.Text := 'SELECT * FROM tabelle WHERE 1=0';
Query.Open;
Query.Append;
Query.FieldByName('feld1').Value := ...;
...
Query.Post;
Query.Close;
Query.Free;
hab das jetzt nicht komplett ausprobiert, kann sein dass hier und da kleine Fehler sind. Z.B. kann es sein, dass TADOQuery dir mit deiner DB nichts nützt. Bei anderen Datasets heißt es dann nicht Parameters.ParamByName sondern Params.ParamByName. Aber grob stimmt es so jedenfalls.

Hansa 12. Mär 2007 16:14

Re: Daten mit DataSet in Datenbank schreiben
 
Oh je, Chaos-Thread. :mrgreen:

Zitat:

Zitat von mkinzler
Zitat:

P.S.: das Value würde ich mir abgewöhnen. Habe z.B. jetzt nur geraten, ob es überhaupt um integer geht.
Kannst du das auch begründen?

Begründung ?

Delphi-Quellcode:
abc.xy := D_DataModule.DataSet.FieldByName('FAID').Value;
Ist da irgendein Hinweis auf den zu verwendenden Datentyp auf Anhieb und ohne zu testen zu erkennen ? Testen würde in diesem Fall Try and Error bedeuten. :shock:

Zitat:

Zitat von bttb930
Vergiss es, so läuft es nicht.
...
Erstmal frage ich mich, ob es überhaupt gehen würde. Schließlich ist das kein einfacher SELECT * sondern mit Funktionen.
...
hab das jetzt nicht komplett ausprobiert, kann sein dass hier und da kleine Fehler sind. Z.B. kann es sein, dass TADOQuery dir mit deiner DB nichts nützt
...
Aber grob stimmt es so jedenfalls.

Wieso soll was nicht laufen ?
Welche "Funktionen" ?
Wieso bringst du ADO unnötig ins Spiel ?

Zur Frage an sich : das ganze ist lediglich eine Zuweisung, bei der geklärt sein muss, was rechts und was links steht ( ":=" ). Der Typ rechts und links muss übereinstimmen. Als Zusatzbegründung : dem Value als Variant ist der Typ auch egal.

bttb930 12. Mär 2007 16:33

Re: Daten mit DataSet in Datenbank schreiben
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von bttb930
Vergiss es, so läuft es nicht.
...
Erstmal frage ich mich, ob es überhaupt gehen würde. Schließlich ist das kein einfacher SELECT * sondern mit Funktionen.
...
hab das jetzt nicht komplett ausprobiert, kann sein dass hier und da kleine Fehler sind. Z.B. kann es sein, dass TADOQuery dir mit deiner DB nichts nützt
...
Aber grob stimmt es so jedenfalls.

Wieso soll was nicht laufen ?
Welche "Funktionen" ?
Wieso bringst du ADO unnötig ins Spiel ?

Nicht erst schreiben sondern erst lesen. Zu den drei Fragen:

a) Probier's halt aus. Ich habs ja auch erklärt: Du hängst nichts an sondern überschreibst höchstens.
b) Lies doch mal: "select upper(f.fname), ...". Upper ist eine Funktion.
c) Warum nicht? Hab ja dazu geschrieben, dass es sein kann, dass man statt TADOQuery was anderes verwenden muss.

bttb930 12. Mär 2007 16:37

Re: Daten mit DataSet in Datenbank schreiben
 
Um das nochmal deutlich zu sagen: Der von dir geschriebene Quelltext ist absolut laufunfähig. Was machst du da eigentlich???

Erklär ihn mal bevor du weiter fragst, warum ich glaube dass er nicht lauffähig ist.

da ist jede zeile unlogisch...

Zitat:

Zitat von Hansa
Am besten so :

Delphi-Quellcode:
   with D_DataModule.DataSet do
   D_DataModule.DataSet.Edit;
   while not D_DataModule.DataSet.Eof do begin
      D_DataModule.DataSet.FieldByName('FAID').AsInteger;
      reg.customer[reg.Ac_ID].ID;     ...      
   end;
   D_DataModule.DataSet.Post;
   ...
   D_DataModule.DataSet.Close;


Hansa 12. Mär 2007 16:46

Re: Daten mit DataSet in Datenbank schreiben
 
Zitat:

Zitat von bttb930
..Erklär ihn mal bevor du weiter fragst, warum ich glaube dass er nicht lauffähig ist.
...
da ist jede zeile unlogisch...

Was du glaubst ist mir egal. :mrgreen: Mit ... und ... abgekürzter Fragesteller-Quelltext wird durch bloßes F9-Drücken kaum laufen. Delphi dürfte z.B. hier :

Delphi-Quellcode:
      D_DataModule.DataSet.FieldByName('FAID').AsInteger;
schon eine Fehlermeldung präsentieren. Außerdem gibt es noch FieldByName <F1>. :zwinker:


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