Domino 9 und frühere Versionen > ND9: Entwicklung

ODBCResultSet mit großen Datenmengen

<< < (2/4) > >>

ralph71:
Ich habe jetzt alles hinprogrammiert und es werden bei der ersten Kundennummer brav im ODBCResultSet alle Einträge durchlaufen.
Wenn er fertig ist, dann folgt im Loop wieder:

Res.Firstrow
Do
.....
Res.Nextrow
Loop Until Res.IsEndOfData

Problem: er springt nicht zurück auf den ersten Eintrag sondern bleibt beim letzten Eintrag der ODBCResultSet stehen.
Res.Currentrow und Res.Cachefirstrownum werden trotz
      Res.Currentrow = 1
      Res.Cachefirstrownum = 1
nicht zurückgesetzt. Oder sollte er das bei Res.Firstrow automatisch machen?
Wie schaffe ich den Sprung zurück?

Nachtrag:
hab ich natürlich gemacht...
   Res.Maxrows = 0
   Res.CacheLimit = DB_NONE
   Res.FetchBatchSize = DB_NONE

CarstenH:
Die folgende Kombination scheint mir ungünstig: zu kleiner Cache für zu großes Resultset

Du schreibst, du setzt

--- Zitat ---Res.CacheLimit = DB_NONE
--- Ende Zitat ---

Dazu findet man in der Dokumentation:

--- Zitat ---DB_NONE means that only a very small window, including the current row, is kept in memory.
--- Ende Zitat ---

Du möchtest mit der obigen Einstellung rückwärts springen - dazu findet sich auch etwas in der Dokumentation:

--- Zitat ---Unless caching is enabled, it may not be possible to set the row at a location before the current row.
--- Ende Zitat ---

Der Cache muss (vorher) groß genug festgelegt worden sein um das komplette Resultset aufzunehmen, du kannst swiw nur innerhalb des Caches rückwärts springen. Ob alles in den Cache passt könnte man bspw. durch Setzen des Caches auf Res.NumRows + x herausfinden oder auf DB_ALL setzen und die erste/letzte Zeile des tatsächlichen Caches abfragen.

Die Logik sagt mir dass der Cache nicht nachträglich auf bereits durch das vorwärts Fetchen aus dem Cache verloren gegangene Rows verschoben werden kann ohne neu zu fetchen aka das Resultset neu aufzubauen.

Möglicherweise ist das zusätzlich abhängig vom Treiber und den dort gesetzten (oder nicht gesetzten) Einstellungen.

ralph71:
Letzters habe ich gelesen, aber nicht richtig verstanden (und tue es immer noch nicht.... :-( ).

Ich setze zu Beginn:
   Res.CacheLimit = DB_ALL (im IBM-Forum war DB_NONE die richtige Einstellung....  ???)
   Res.FetchBatchSize = DB_ALL

Im ODBCResultSet stehen bzw. standen schon immer alle Einträge (zu sehen im Debugger).


--- Zitat ---Unless caching is enabled, it may not be possible to set the row at a location before the current row.
--- Ende Zitat ---
--> und genau da ist das Problem. Wie ist das zu machen?

Sorry, da kann ich setzen was ich will, alles ohne Auswirkung.....

eknori (retired):
Ich verstehe das mit dem Zurückspringen auf den ersten Eintrag nicht.

Du nimmst nicht ernsthaft das erste NotesDokument und gehst dann jeden Eintrag im RS durch, bis du die korrespondierende row gefunden hast, dann das nächste NotesDokument usw ?

CarstenH:
Die Aussage zum Caching und rückwärts springen bezog sich primär auf die Kombination mit DB_NONE, was einen viel zu kleinen Cache zur Folge haben dürfte - daher auch meine Zitate aus der Doku.

Die Einstellung DB_ALL sollte zwar Abhilfe schaffen aber in verschiedenen Foren ist zu lesen, dass dieser allgemeine Parameter nicht immer funktioniert und in den Fällen das Setzen eines festen Wertes (der mindestens der Größe des Resultsets entspricht) Abhilfe geschaffen hat.
Zum Beispiel hier: http://www-10.lotus.com/ldd/nd6forum.nsf/DateAllThreadedweb/7a1c88812ab473ba852575d10066d3af?OpenDocument

Was steht denn in CacheFirstRowNum / CacheLastRowNum kurz bevor du den Rücksprung versuchst?

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln