![]() |
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 |
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 |
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 ;) |
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
Zitat:
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] |
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:
Es fehlt ein adoQuerySeasons.Edit; am Anfang der while-Schleife. Das Statement muss IMHO als erstes in die While-Schleife
[...] // 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; |
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. |
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
Nun habe ich ein neues Problem...
Und zwar ein Zitat aus meiner IDE :
Code:
Tritt an folgender Stelle auf (in der Schleife):
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)
Delphi-Quellcode:
Bei Google kann man auch keine genauen Informationen finden, das einzige was ich gefunden habe ist :
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; ![]() 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] |
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 |
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
Hallo,
Zitat:
Ich würde eh nicht mit Append/Post arbeiten. Hier bietet sich doch die direkte Arbeit mit SQL ala
Delphi-Quellcode:
und prepared Queries an.
adoQueryEpisodes.SQL:= 'Insert Into ' xxx
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:
usw. schreiben.
var
iSerieID: Integer; begin iSerieID := adoQuerySeasons['SerieID']; for XXX do begin adoQueryEpisodes['SerieID'] := iSerieID; end; Dann kann man zumindestens das ganze mal anständig debuggen. und zum Schluss. Dein Code
Delphi-Quellcode:
Was soll das Edit hier machen ? Das kann komplett weg.
adoQuerySeasons := DataBase.SQLExecSelect('SELECT * FROM Seasons'); // steht auf erstem Datensatz
adoQuerySeasons.Edit; 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 |
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
EDIT: Doppelpost, Sorry
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz