![]() |
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" ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:07 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