![]() |
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
|
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:
Gruß, Real-TTX// 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; |
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
Hallo,
nun gut, aber warum schreibst du
Delphi-Quellcode:
Das adoQuerySeries.Edit ist nicht nur überflüssig,
adoQuerySeries.Edit;
// Serien abfragen arrLinks := obj.getSeriesAll; // Dataset (Serien) befüllen for i := 0 to Length(arrLinks) - 1 do begin adoQuerySeries.Append; 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:
|
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:
Danke euch... Gruß, Real-TTX |
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 |
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 |
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... :/ |
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 |
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
Wie erstelle ich am leichtesten Parameter mit dem ADODataSet ?
Gruß, Real-TTX |
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
Delphi-Quellcode:
Das ist doch Käse; entweder Edit ODER Append, aber nicht Beides hintereinander.
...
adoQuerySeries.Edit; adoQuerySeries.Append; >>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:
Es kommt halt immer auf den Zweck an.
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; 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. |
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:
sondern
while adoQuerySeries.Eof = false do
Delphi-Quellcode:
In der Windows-API wird <> 0 als true und = 0 als false verstanden, die Konstanten sind aber mit 1 (true) bzw. 0 (false) belegt.
while not adoQuerySeries.Eof do
Spielt hier für das Problem wohl keine Rolle, ist aber "unschön" ;-) |
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
Zitat:
Aber da adoQuerySeries.Eof ja eine in Delphi deklarierte Eigenschaft ist, die als boolean deklariert ist. Kann es ja nur true oder false sein (0 || 1) und nicht (0 || !0) ... Oder sehe ich das nicht falsch ? Und wenn ich schreibe :
Delphi-Quellcode:
ist das meiner Ansicht nach leserlicher als wie wenn ich schreibe
while adoQuerySeries.Eof = false do
Delphi-Quellcode:
Vermutlich bin ich aber auf dem Holzweg? :O
while not adoQuerySeries.Eof do
|
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
Finde ich nicht. zudem sollte man einen Boolean-Wert nie auf false prüfen
|
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
@shmia : Ahh.. Ich verstehe. Ich habe das ganze mal rausgenommen. Ich war da doch ein stück verwirrt. Und gibt es eine leichte Möglichkeit mit Parametern zu arbeiten mit DataSets ? Oder geht das nur mit dem ADO.Command ? Und dann Create Paramter und Append? Das habe ich damit nämlich schonmal versucht. Aber nicht wirklich mit erfolg :(
Gruß, Real-TTX PS: Danke nochmal an alle :) |
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
Zitat:
So irrt man sicht.. Da war ich mir bis vor 5min noch richtig Sicher... und jetzt ist wieder alles zu nichte :( ... Aber danke für die berichtigung.... :) Gruß, Real-TTX |
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
Zitat:
Siehe auch #20 |
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
Juhuuuuuu,
kommt mal wieder zum Thema zurück ;) also mit einer Query sind Parameter doch schön einfach. Ich spare mir mal ein Bsp., du gibt es hier genug. Heiko |
Re: Datenmenge ist weder im Editiert noch im Einfügemodus...
gelöscht
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 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