Delphi-PRAXiS
Seite 1 von 3  1 23      

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 12. Jul 2009 20:36

Datenbank: Access • Version: MDAC 2.8 • Zugriff über: ADO

Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Wie schon im Titel, sieht man die Fehlermeldung die bei mir erscheint nachdem 700+ Mal (in einer Schleife) meine Menge im Editiert Modus war... :(

Delphi-Quellcode:
  // Leere Ergebnismenge holen
  adoQuerySeries := DataBase.SQLExecSelect('SELECT * FROM Series');
  adoQuerySeries.Edit;

  // Serien abfragen
  arrLinks := obj.getSeriesAll;

  // Befüllen mit Serien (Name / Link)
  for i := 0 to Length(arrLinks) - 1 do
  begin
    adoQuerySeries.Append;
    adoQuerySeries['Link'] := arrLinks[i, 0];
    adoQuerySeries['Name'] := arrLinks[i, 1];
  end;
 
  // Zeigt die Anzahl an (~2300)
  ShowMessage(IntToStr(adoQuerySeries.RecordCount));

  // Daten an DB
  adoQuerySeries.Post;

  // Inhalt neu Laden der Serien (AutoWert - Rep. ID)
  adoQuerySeries := DataBase.SQLExecSelect('SELECT * FROM Series');

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

  x := 1;
  while adoQuerySeries.Eof = false do // IN DIESER SCHLEIFE TRITT DER FEHLER AUF <----------
  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'];
    end;
    Memo1.Lines.Add(IntToStr(x) + ' - ' + adoQuerySeries['Name']);
    Application.ProcessMessages;
    inc(x);
    adoQuerySeasons.Post;
    adoQuerySeries.Next;
  end;

   // Inhalt neu Laden der Staffeln
  adoQuerySeasons := DataBase.SQLExecSelect('SELECT * FROM Seasons');
  adoQueryEpisodes := DataBase.SQLExecSelect('SELECT * FROM Episodes');
  adoQueryEpisodes.Edit;

  while adoQuerySeasons.Eof = false do
  begin
    arrLinks := obj.getEpisodes(adoQuerySeasons['Link']);
    for i := 0 to Length(arrLinks) - 1 do
    begin
      adoQueryEpisodes.Append;
      adoQueryEpisodes['Link'] := arrLinks[i, 0];
      adoQueryEpisodes['Name'] := arrLinks[i, 1];
      adoQueryEpisodes['SerieID'] := adoQueryEpisodes['SerieID'];
      adoQueryEpisodes['SeasonID'] := adoQueryEpisodes['SeasonID'];
    end;
    adoQueryEpisodes.Post;
    adoQuerySeasons.Next;
  end;

Leider bin ich relativ ratlos, da der Fehler sporadisch auftritt... :/

Gruß, Real-TTX

sx2008 12. Jul 2009 20:41

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Nach jedem .Append muss auch ein .Post kommen:
Delphi-Quellcode:
// Befüllen mit Serien (Name / Link)
  for i := 0 to Length(arrLinks) - 1 do
  begin
    adoQuerySeries.Append;
    adoQuerySeries['Link'] := arrLinks[i, 0];
    adoQuerySeries['Name'] := arrLinks[i, 1];
    adoQuerySeries.Post; // HIER !!
  end;
 
  // Zeigt die Anzahl an (~2300)
  ShowMessage(IntToStr(adoQuerySeries.RecordCount));

  // Daten an DB
  adoQuerySeries.Post; // FALSCH

Real-TTX 12. Jul 2009 20:48

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Hmm.. aber die Serien hat er Ordnungsgemäß geladen. Nur ab der zweiten Schleife (die mit einem Kommentar gekennzeichnet ist) dort tritt der Fehler auf bei 700+ ...

Aber es läuft gerade... Mal schauen :P

Dank dir ;)

haentschman 12. Jul 2009 22:10

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

Nach jedem .Append muss auch ein .Post kommen:
hmmm... ich kenn es genau anders rum. Nach einem Append ist die Datenmenge nicht mehr im EditModus. :gruebel:
Wenn ich nach einem Append (Zeos) Daten dieses Datensatzes ändern möchte muß ich Edit-->Ändern-->Post machen ansonsten würde ich beim Post besagte Meldung bekommen. Vieleicht verhällt sich Ado anders :gruebel:

bis bald...

[Edit nach Hilfe lesen :-D ]
...Kommando zurück. Mit Append bleibt der Datensatz im Edit. Ich arbeite mit AppendRecord und da wird der Eintrag schon mit Post abgeschlossen.
:gruebel: dann ist das schon komisch
[/Edit]

mashutu 13. Jul 2009 07:37

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
[quote="Real-TTX"]Wie schon im Titel, sieht man die Fehlermeldung die bei mir erscheint nachdem 700+ Mal (in einer Schleife) meine Menge im Editiert Modus war... :(

Delphi-Quellcode:
[...] // Inhalt neu Laden der Serien (AutoWert - Rep. ID)
  // ...
  adoQuerySeasons := DataBase.SQLExecSelect('SELECT * FROM Seasons'); // steht auf erstem Datensatz
  adoQuerySeasons.Edit;                                              // erster Datensatz Seasons im Edit-Mode

  x := 1;
  while adoQuerySeries.Eof = false do // IN DIESER SCHLEIFE TRITT DER FEHLER AUF <----------
  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'];
    end;
    Memo1.Lines.Add(IntToStr(x) + ' - ' + adoQuerySeries['Name']);
    Application.ProcessMessages;
    inc(x);
    adoQuerySeasons.Post;                                           // Datensatz Seasons wird gespeichert
    adoQuerySeries.Next;                                            // zweiter Datensatz Series
  end;
//[...]
  end;
Es fehlt ein adoQuerySeasons.Edit; am Anfang der while-Schleife. Das Statement muss IMHO als erstes in die While-Schleife

sx2008 13. Jul 2009 08:29

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Irgendwie scheint es hier Unklarheiten zu geben, wie man Edit, Insert, Append und Post verwendet.
Es gibt 3 Möglichkeiten, wie man eine Datenänderung an einem Dataset beginnt:
Edit, Insert oder Append.
Edit verändert einen bestehenden Datensatz, Insert&Append fügt einen neuen Datensatz hinzu.
Nach einer dieser 3 Methoden sollte/muss immer Post oder Cancel folgen.
Post - Änderungen übernehmen, Cancel - Änderungen verwerfen.

Was passiert nun, wenn man wiederholt immer nur Append verwendet?
Das erneute Append impliziert intern automatisch ein Post,
aber sauber ist das natürlich nicht.
Es muss so sein, wie ich in Beitrag #2 geschrieben habe.

Zwischen Insert und Append gibt es übrigens einen kleinen Unterschied:
Append fügt die Daten am Ende an, Insert dazwischen.
Insert benötigt dafür mehr Aufwand und ist langsamer als Append.
Daher ist Append innerhalb von Schleifen vorzuziehen.
Für die Daten spielt es keine Rolle, ob Insert oder Append verwendet wurde.
Wird die Datenmenge geschlossen und neu geöffnet hängt die Reihenfolge der Datensätze
eh nur vom Primärschlüssel oder sonstiger Sortierklausel (ORDER BY) ab.

Real-TTX 13. Jul 2009 13:37

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
Nun habe ich ein neues Problem...

Und zwar ein Zitat aus meiner IDE :
Code:
Erste Gelegenheit für Exception bei $7C80BEF7. Exception-Klasse EOleException mit Meldung 'Der Datenprovider oder ein anderer Dienst gab den Status E_FAIL zurück'. Prozess Project1.exe (1540)
Erste Gelegenheit für Exception bei $7C80BEF7. Exception-Klasse EDatabaseError mit Meldung 'Der Datenprovider oder ein anderer Dienst gab den Status E_FAIL zurück'. Prozess Project1.exe (1540)
Tritt an folgender Stelle auf (in der Schleife):

Delphi-Quellcode:
  while adoQuerySeasons.Eof = false do
  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;
Bei Google kann man auch keine genauen Informationen finden, das einzige was ich gefunden habe ist : http://support.microsoft.com/kb/235053

Und das sollte nicht zutreffen... :)

Gibt es da einen Grund für das E_FAIL oder kann es noch etwas anderes aussagen?

Gruß, Real-TTX

PS: Danke für die super Unterstützung :)

[EDIT]Anmerkung : Das Problem tritt erst bei mehr als 500 Durchläufen auf....[/EDIT]

Real-TTX 13. Jul 2009 15:36

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
So wie ich die Datensätze hinzufüge kann keine SQL-Injection auftreten, oder ? Kann es an irgentwelchen Zeichen oder ähnlichem liegen?

Gruß, Real-TTX

hoika 13. Jul 2009 17:07

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

Zitat:

Tritt an folgender Stelle auf (in der Schleife):
In welcher Zeile, wie sind die übergebenen Daten.

Ich würde eh nicht mit Append/Post arbeiten.

Hier bietet sich doch die direkte Arbeit mit SQL ala

Delphi-Quellcode:
adoQueryEpisodes.SQL:= 'Insert Into ' xxx
und prepared Queries an.


Ich schätze, eines der adoQueryEpisodes['XXX'] bekommt einen ungültigen Wert übergeben.

Ausserdem würde ich statt

Delphi-Quellcode:
for XXX do
begin
  adoQueryEpisodes['SerieID'] := adoQuerySeasons['SerieID'];
end;
Delphi-Quellcode:
var
  iSerieID: Integer;
begin
  iSerieID := adoQuerySeasons['SerieID'];

  for XXX do
  begin
    adoQueryEpisodes['SerieID'] := iSerieID;
  end;
usw. schreiben.

Dann kann man zumindestens das ganze mal anständig debuggen.


und zum Schluss.
Dein Code
Delphi-Quellcode:
adoQuerySeasons := DataBase.SQLExecSelect('SELECT * FROM Seasons'); // steht auf erstem Datensatz
adoQuerySeasons.Edit;
Was soll das Edit hier machen ? Das kann komplett weg.


Ich denke, das mit dem 500+ kommt einfach davon, dass ADO hier
mehrfach eine Edit "startet", sich das merkt und irgendwann was internes überläuft.


Zeige doch mal den Code, um zu sehen, was du bisher schon geändert hast.


Heiko

Real-TTX 13. Jul 2009 18:36

Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
 
EDIT: Doppelpost, Sorry


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:01 Uhr.
Seite 1 von 3  1 23      

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