AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datenmenge ist weder im Editiert noch im Einfügemodus...
Thema durchsuchen
Ansicht
Themen-Optionen

Datenmenge ist weder im Editiert noch im Einfügemodus...

Ein Thema von Real-TTX · begonnen am 12. Jul 2009 · letzter Beitrag vom 14. Jul 2009
Antwort Antwort
Seite 1 von 3  1 23      
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#1

Datenmenge ist weder im Editiert noch im Einfügemodus...

  Alt 12. Jul 2009, 20:36
Datenbank: Access • Version: MDAC 2.8 • Zugriff über: ADO
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
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

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

  Alt 12. Jul 2009, 20:41
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
fork me on Github
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#3

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

  Alt 12. Jul 2009, 20:48
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

Dank dir
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 12. Jul 2009, 22:10
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.
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

bis bald...

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

Registriert seit: 15. Nov 2007
195 Beiträge
 
#5

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

  Alt 13. Jul 2009, 07:37
[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
utu

if it was hard to write it should be hard to read
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

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

  Alt 13. Jul 2009, 08:29
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.
fork me on Github
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#7

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

  Alt 13. Jul 2009, 13:37
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]
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#8

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

  Alt 13. Jul 2009, 15:36
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 13. Jul 2009, 17:07
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

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
Heiko
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#10

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

  Alt 13. Jul 2009, 18:36
EDIT: Doppelpost, Sorry
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 Uhr.
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