Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenmenge ist weder im Editiert noch im Einfügemodus... (https://www.delphipraxis.net/137026-datenmenge-ist-weder-im-editiert-noch-im-einfuegemodus.html)

Real-TTX 13. Jul 2009 18:37

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Naja... Ich mach das über Edit und Post. Damit ich mir sämtliche Parameter sparen kann und es über das DataSet sehr komfortabel ist. Finde ich zumindest :) Und bei einem SQL Statement ohne Parameter... wäre das nur Murks....

Die ID Kann nicht leer sein... Das ist ein AutoWert von Access. Eine Replikations-ID.

Hier wäre der Code :

Delphi-Quellcode:

  // Leeres Dataset auslesen (Serien)
  adoQuerySeries := DataBase.SQLExecSelect('SELECT * FROM Series');
  adoQuerySeries.Edit;

  // Serien abfragen
  arrLinks := obj.getSeriesAll;

  // Dataset (Serien) befüllen
  for i := 0 to Length(arrLinks) - 1 do
  begin
    adoQuerySeries.Append;
    adoQuerySeries['Link'] := arrLinks[i, 0];
    adoQuerySeries['Name'] := arrLinks[i, 1];
    adoQuerySeries.Post;
  end;

  // Inhalt neu laden (Serien) für den AutoWert
  adoQuerySeries := DataBase.SQLExecSelect('SELECT * FROM Series');

  // Leeres Dataset auslesen (Staffeln)
  adoQuerySeasons := DataBase.SQLExecSelect('SELECT * FROM Seasons');
  adoQuerySeasons.Edit;

  // Dataset (Staffeln) befüllen
  while adoQuerySeries.Eof = false do
  begin
    arrLinks := obj.getSeasons(adoQuerySeries['Link']);
    for i := 0 to Length(arrLinks) - 1 do
    begin
      adoQuerySeasons.Append;
      adoQuerySeasons['Link'] := arrLinks[i, 0];
      adoQuerySeasons['Name'] := arrLinks[i, 1];
      adoQuerySeasons['SerieID'] := adoQuerySeries['SerieID'];
      adoQuerySeasons.Post;
    end;
    adoQuerySeries.Next;
  end;

  // Inhalt neu laden (Staffeln) für den AutoWert
  adoQuerySeasons := DataBase.SQLExecSelect('SELECT * FROM Seasons');

  // Leeres Dataset auslesen (Folgen)
  adoQueryEpisodes := DataBase.SQLExecSelect('SELECT * FROM Episodes');
  adoQueryEpisodes.Edit;

  // Dataset (Episoden) befüllen
  while adoQuerySeasons.Eof = false do                         // <-------- In dieser Stelle tritt der Fehler auf....
  begin
    arrLinks := obj.getEpisodes(adoQuerySeasons['Link']);
    for i := 0 to Length(arrLinks) - 1 do
    begin
      adoQueryEpisodes.Append;
      adoQueryEpisodes['Link'] := arrLinks[i, 1];
      adoQueryEpisodes['Name'] := arrLinks[i, 0];
      adoQueryEpisodes['SerieID'] := adoQuerySeasons['SerieID'];
      adoQueryEpisodes['SeasonID'] := adoQuerySeasons['SeasonID'];
      adoQueryEpisodes.Post;
    end;
    adoQuerySeasons.Next;
  end;
Gruß, Real-TTX

hoika 13. Jul 2009 18:54

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Hallo,

nun gut, aber warum schreibst du

Delphi-Quellcode:
adoQuerySeries.Edit;

// Serien abfragen
arrLinks := obj.getSeriesAll;

// Dataset (Serien) befüllen
for i := 0 to Length(arrLinks) - 1 do
begin
  adoQuerySeries.Append;
Das adoQuerySeries.Edit ist nicht nur überflüssig,
sondern vielleicht die Ursache.

Ausserdem würde ich gern wissen, was genau obj.getSeriesAll macht
und vor allem ob adoQuerySeries dort verwendet wird.
Oder ist das was lokales internes ?


Das Edit/Append/Post hast du übrigens an 3 Stellen.
Also kommentier die 3 Edit mal aus.


Heiko

PS:
Zitat:

und es über das DataSet sehr komfortabel ist
Prepared Queries kennst du ?

Real-TTX 13. Jul 2009 20:21

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Es lag so wie es aussieht wirklich an dem Edit. Das Edit ist ja nur für jeden Datensatz... Bin etwas durcheinander gekommen. Wie sx2008 schon gesgat hat, gab es da ein bisschen durcheinander.... Um deine Fragen noch zu beantworten :

Zitat:

Zitat von hoika
Hallo,

Ausserdem würde ich gern wissen, was genau obj.getSeriesAll macht
und vor allem ob adoQuerySeries dort verwendet wird.
Oder ist das was lokales internes ?

obj.getSeriesAll --> Ruft von einer bestimmten Quelle sämtliche Serien ab (Link und Name der Serie) in ein 2 Dim. Array (Array of Array[0..1] of string)

Danke euch...

Gruß, Real-TTX

Real-TTX 13. Jul 2009 20:24

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Musste gerade feststellen das der Fehler wieder auftritt nun aber nach 23778 durchläufen :/ Aber wieder sporadisch... :(

An einem Überlauf kann es demnach wohl nicht liegen.... :(


Gruß, Real-TTX

hoika 14. Jul 2009 06:52

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Hallo,

hast du denn alle 3 Edits rausgenommen ?
Poste noch mal den aktuellen Code
und die Fehlerstelle.

Ich benutze nie Append/Post bei Queries
(habe allerdings Firebird unter BDE/FIBPlus).

Stelle es doch testweise mal um SQL.Text:= XXX


Heiko

Real-TTX 14. Jul 2009 16:00

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Wenn ich die 3 Edits rausnehme. Kommt eine Fehlermeldung : "Datensatz ist nicht im Einfüge oder Editier Modus..." Mein Aktueller Code :

Delphi-Quellcode:
  // Leeres Dataset auslesen (Serien)
  adoQuerySeries := DataBase.SQLExecSelect('SELECT * FROM Series');

  // Serien abfragen
  arrLinks := obj.getSeriesAll;

  // Dataset (Serien) befüllen
  for i := 0 to Length(arrLinks) - 1 do
  begin
    adoQuerySeries.Edit;
    adoQuerySeries.Append;
    adoQuerySeries['Link'] := arrLinks[i, 0];
    adoQuerySeries['Name'] := arrLinks[i, 1];
    adoQuerySeries.Post;
  end;

  // Inhalt neu laden (Serien) für den AutoWert
  adoQuerySeries := DataBase.SQLExecSelect('SELECT * FROM Series');

  // Leeres Dataset auslesen (Staffeln)
  adoQuerySeasons := DataBase.SQLExecSelect('SELECT * FROM Seasons');

  // Dataset (Staffeln) befüllen
  while adoQuerySeries.Eof = false do
  begin
    arrLinks := obj.getSeasons(adoQuerySeries['Link']);
    for i := 0 to Length(arrLinks) - 1 do
    begin
      adoQuerySeasons.Edit;
      adoQuerySeasons.Append;
      adoQuerySeasons['Link'] := arrLinks[i, 0];
      adoQuerySeasons['Name'] := arrLinks[i, 1];
      adoQuerySeasons['SerieID'] := adoQuerySeries['SerieID'];
      adoQuerySeasons.Post;
    end;
    adoQuerySeries.Next;
  end;

  // Inhalt neu laden (Staffeln) für den AutoWert
  adoQuerySeasons := DataBase.SQLExecSelect('SELECT * FROM Seasons');

  // Leeres Dataset auslesen (Folgen)
  adoQueryEpisodes := DataBase.SQLExecSelect('SELECT * FROM Episodes');

  // Dataset (Episoden) befüllen
  while adoQuerySeasons.Eof = false do // <--- HIER TRITT DER FEHLER AUF in dieser WHILE... Wo genau kann ich nicht feststellen :O
  begin
    arrLinks := obj.getEpisodes(adoQuerySeasons['Link']);
    for i := 0 to Length(arrLinks) - 1 do
    begin
      adoQueryEpisodes.Edit;
      adoQueryEpisodes.Append;
      adoQueryEpisodes['Link'] := arrLinks[i, 1];
      adoQueryEpisodes['Name'] := arrLinks[i, 0];
      adoQueryEpisodes['SerieID'] := adoQuerySeasons['SerieID'];
      adoQueryEpisodes['SeasonID'] := adoQuerySeasons['SeasonID'];
      adoQueryEpisodes.Post;
    end;
    adoQuerySeasons.Next;
  end;

Danke.. Ich bin wirklich sehr ratlos :( Und komme irgendwie nicht weiter... :/

hoika 14. Jul 2009 16:19

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Hallo,

also ich sage nur, verabschiede dich von diesem Append/Post.
Ersetze es durch normales SQL.

Ist dir das zu aufwendig, weil es mit dem Append so schön ist,
musst du mit dem Fehler leben ...

Ich habe hier Code, da laufen zigtausend Insert/Update/Deletes
(OK, das sind Unit-Tests).


Heiko

Real-TTX 14. Jul 2009 16:42

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Wie erstelle ich am leichtesten Parameter mit dem ADODataSet ?

Gruß, Real-TTX

shmia 14. Jul 2009 16:47

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Delphi-Quellcode:
...
  adoQuerySeries.Edit;
  adoQuerySeries.Append;
Das ist doch Käse; entweder Edit ODER Append, aber nicht Beides hintereinander.

>>also ich sage nur, verabschiede dich von diesem Append/Post.
>>Ersetze es durch normales SQL.
Normales SQL (also INSERT INTO ...) ist ungefähr 5 Mal schneller und braucht weniger lokale Resourcen.
Allerdings ist der Programmieraufwand zum Daten einfügen etwa doppelt so hoch
und man muss auf angenehme Dinge (z.B. Event Before Post) verzichten.
Mit dem Einfügen über's Dataset ist man manchmal auch flexibler:
Delphi-Quellcode:
Dataset.Append; // neuer Datensatz
Dataset['IdUser'] := ....
Dataset['LastChange'] := Now;
// kein Problem, wenn das Feld Geburtstag in der Tabelle fehlen sollte
if Assigned(dataset.FindField('Geburtstag'))) then
   Dataset['Geburtstag'] := ...
Dataset.Post;
Es kommt halt immer auf den Zweck an.
Wenn die Anzahl der Records * Anzahl der Felder > 5000 *) dann würde ich aus Geschwindigkeitsgründen
INSERTS verwenden; darunter mag ich eher das einfache Handling von Datasets.
*) Bitte nur als ganz groben Anhaltspunkt nehmen.

Christian Seehase 14. Jul 2009 17:15

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Moin,

unabhängig von allem anderen:
Man vergleicht boolsche-Ausdrücke nicht auf True oder False
Delphi-Quellcode:
while adoQuerySeries.Eof = false do
sondern
Delphi-Quellcode:
while not adoQuerySeries.Eof do
In der Windows-API wird <> 0 als true und = 0 als false verstanden, die Konstanten sind aber mit 1 (true) bzw. 0 (false) belegt.
Spielt hier für das Problem wohl keine Rolle, ist aber "unschön" ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:21 Uhr.
Seite 2 von 3     12 3      

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