Toon posts:

[ADODB VB6]Kopieren van recordset

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een in-memory recordset (dus zonder tabel) van circa 2000 records en 15 velden.
Ik wil deze recordset bewaren en aanpassen, dus wil ik de recordset kopieren zodat ik de tweede kan aanpassen.
Nu heb ik al .clone gebruikt maar ik heb begrepen dat als ik iets aanpas in de gekloonde set de wijzigingen ook in de orginele set worden doorgevoerd. Dat is niet wat ik nodig heb.
Verder heb ik geprobeerd met:
code:
1
Set rstKloon= rstOrgineel

Dit lijkt goed te gaan.
recordcount en fields.count geven de juiste waarden.
Maar als ik een veld ga toevoegen met Fields.append
dat ben ik ineens alle 'oude' velden kwijt en heb ik nog maar 1 veld (de nieuwe)

Nu kan ik twee dingen doen, die me beide niet de juiste oplossing lijken.

1. Ik ga door mijn orgineel heen loopen en kopieer record voor record (per veld?)
2. Ik doe een rstOrgineel.save en vervolgens een rstKloon.open, alleen wordt dit bestand ca. 2 MB groot en duurt het ca. 4 sec. om te saven en 4 sec. om weer te openen.

Wat is de juiste en vooral de snelste manier om een recordset te kopieren?

Graag advies.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Zou je niet een database gebruiken? Als je app crasht ben je alle data kwijt.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Verwijderd schreef op 07 april 2004 @ 17:19:
code:
1
Set rstKloon= rstOrgineel
Die code zet de referentie rstKloon naar hetzelfde object als rstOrigineel. Maw, dit is geen kopie van je object, maar een kopie van je pointer.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
@Farlane:
Je hebt helemaal gelijk dat had ik zelf ook moeten weten.

@EfBe:
Het gebruik van een database is niet nodig omdat de invoer bestaat uit tekstbestanden en de uitvoer (na toevoegingen van berekeningen) ook uit een tekstbestand. Om daarvoor een database te gebruiken is veel te veel overhead. Ik heb tussendoor de mogelijkheid om de data op te slaan in een binair databestand dus ben ik nooit alles kwijt.

Ik ga denk ik maar voor de oplossing ga om mijn rstOrgineel op te slaan in een databestand en vervolgens rstKloon dat databestand te laten openen.
Mocht er een betere manier zijn dan hoor ik dat graag.

Verwijderd

Er is een manier om een kopie te maken, maar daarbij wordt wel een bestand aangemaakt.

code:
1
2
rs1.Save strPadNaarBestand
rs2.Open strPadNaarBestand, Options:=adCmdFile

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 14:07

mulder

ik spuug op het trottoir

Changes you make to one Recordset object are visible in all of its clones regardless of cursor type. However, after you execute Requery on the original Recordset, the clones will no longer be synchronized to the original.
BRON: http://msdn.microsoft.com...ado270/htm/mdmthclone.asp

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
@FFrenzy
Deze optie had ik al in mijn eerste post gegeven en nogmaals in de post net boven de jouwe ;)
Maar toch bedankt voor het meedenken.

@Don Facundo
Dat lijkt goed. Dat ga ik zeker eerst proberen. Ik ben nu druk met wat anders, maar als ik hier uitkom dan laat ik het hier weten.
Bedankt voor alle response

Verwijderd

Topicstarter
Ik ben weer begonnen aan het project waar ik een recordset wil kopieren en vervolgens het kopie wil aanpassen.
Deel 1 staat hier:
[rml][ ADODB VB6]Kopieren van recordset[/rml]

De genoemde optie van clone en requery:
code:
1
2
3
  Set rstNew = rstOrg.Clone
  rstNew.Requery
  rstNew.Fields.Append "Kanaal", adInteger


De laatste regel geeft de volgende error:
De bewerking is in deze context niet toegestaan.

De genoemde optie van save as file en open file:
code:
1
2
  rstOrg.Save sFilename, adPersistADTG
  rstNew.Open sFilename


Ik heb nu wel een exacte kopie van het orgineel.
Maar nu mag ik geen velden toevoegen omdat rst al open is |:(
Als ik voor het openen de velden definieer, wordt sFilename niet geopend (ik krijg ook geen foutmelding). Er wordt dan geen data ingelezen en heb ik dus een lege recordset. 8)7

Ik zie het bijna niet meer zitten, er moet toch een manier zijn om een recordset te kopieren en vervolgens aan te passen.
Is er misschien een andere oplossing zonder recordset. Ik gebruik het zonder database en alleen maar om veel data makkelijk te benaderen.
Het gaat eerst om ca. 1500 records in 15 velden en later (de gekopieerde) wordt het 1500 records en ca 280 velden.

  • Lister
  • Registratie: September 2001
  • Laatst online: 15-02-2022
Als het niet al te vaak moet gebeuren kan je het doen door echt zelf een nieuwe recordset aan te maken en daar eerst de bestaande velden in te hangen en daarna je eigen nieuwe velden.
En daarna alle data record voor record overzetten.

Dan zou je zoiets moeten krijgen (uit mijn hoofd) :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Set rstNew = New ADODB.Recordset
For each fldField in rstOrg.Fields
     rstNew.Fields.Add fldField.Name, fldField.Type, fldField.DefinedSize, fldField.Attributes
Next fldField

' voeg hier zelf je nieuwe velden toe

rstNew.Open
rstOrg.MoveFirst
Do While Not rstOrg.EOF
    rstNew.AddNew
    For each fldField in rstOrg.Fields
          rstNew.Fields(fldField.Name).Value = fldField.Value
    Next fldField
    rstNew.Update
    rstOrg.MoveNext
Loop

Afhankelijk van de soort en hoeveelheid data kan dit wel even duren dus ik weet niet of het werkbaar is.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:56

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom ga je niet gewoon door in je oude topic :?
Ik verplaats de berichten even als je het niet erg vindt, beetje onzin om een tweede topic te starten over hetzelfde onderwerp als je vorige nog geen maand oud is

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
@Lister
Ik ga het inderdaad niet vaak doen, ik zal je oplossing proberen en de tijd bijhouden.

@.oisyn
Ik dacht dat dat handiger was. Het samenvoegen vind ik prima. Ik zal er de volgende keer om denken _/-\o_

Verwijderd

Topicstarter
Het werkt eindelijk en nog snel ook.
Ik dacht juist dat het 1 voor 1 kopieren van de records juist erg kostbaar zou zijn. Maar het duurde maar 0.1 seconden. Terwijl het opslaan naar een bestand al 0.2 seconden duurt en het inlezen 0.3 seconden.

Weer wat geleerd vandaag.

Hartelijk dank allemaal voor het meedenken. _/-\o_
Pagina: 1