Newsgroup: it.comp.lang.visual-basic
Titolo: Copiare un recordset

Ciao a tutti,
Domanda veloce: esiste un sistema per farsi una copia di un recordset ADO 
senza ciclarsi tutti i record e tutti i campi?
Ciao 

Fabio ha scritto:

Metodo Clone
Set rstDuplicato = rstOriginale.Clone (TipoBlocco)
Non sò se per copia intendessi questo, poichè questa copia è un
Clone quindi sincronizzato con il Recordset originale(finchè questo
non viene aggiornato)...!
@Alex

 non viene aggiornato)...!
E no!
Questo mica copia :)
Crea solo un nuovo puntatore al Recordset con i propri cursori.
Io voglio proprio una copia dei dati in un nuovo recordset.
Ciao 

Fabio ha scritto:

Infatti l'ho detto che non ero certo che per COPIA potesse andare il
CLONE...!
Speravo fosse più semplice...!
Credo che l'unica cosa sia come dicevi prima crearsi un Recordset ADO
in memoria
ciclando tutti i Records ed all'interno tutti i Fields....!
Bel lavoretto, direi veloce ed ottimizzato..... ;-)
Ma scusa una domanda stupida non hai la SQL del RS originale....?
Rs.Source....?
Creati un 2° Recordset...!!!(A meno che non volessi proprio averlo in
Memoria solamente)
@Alex



Non vedo l'utilità di ciò!
perchè dovrei avere 2 recordset con la solita roba???
CMQ
SI!
pensaci....
se Rs1 lo hai aperto con una select
fai RS2 con la SOLITA select...i dati son uguali...i recordset diversi!
L'unica cosa che mi viene in mente dell'utilità di ciò...lo vuoi fare per
provare un accesso concorrente!
OPPURE
appoggiati al database....
dagli di SQL INSERT INTO...e fatti una tabella (es TempCloneRS)...con la
solita select con cui generi il database...avresti una tabella clone del
recordset (forse ti potrebbe servire per raccogliere tutti gli input di un
utente e validare/accettare in seguito i suoi cambiamenti???Le modifiche di
un doc??stai programmando un Wiki???...boh!....capisco poco a cosa ti
serve!!!)

 solita select con cui generi il database...zac
Ovvio non database ...ma recordset.
...troppi pensieri di prima mattina!

 fai RS2 con la SOLITA select...i dati son uguali...i recordset diversi!
Premesso che non č una mia scelta, il problema č semplicemente che un 
recordset potrebbe anche non derivare da una select, ma essere usato come 
semplice contenitore di dati.
Lo scopo č che si vuole tenere il recordset originale e lavorare sul 
secondo, lo scopo finale ancora mi č sconosciuto.
Ciao 

 Ciao
La cosa migliore è, penso io, come ti dicevo un Recordset TEMP in
memoria, nel caso poi si voglia fare l'UpdateBatch puoi anche
aggiornare l'origine...!
@Alex

 aggiornare l'origine...!
Come dicevo, l'origine può darsi che non esista se ad es. il recordset è 
stato creato a runtime.
Ciao 

Fabio ha scritto:

Se l'origine non esiste(strano però) mentre ti crei un RS ti crei
anche il 2°, altrimenti
ciclalo e copia i singoli Item in un RS in memoria...!
@Alex

 ciclalo e copia i singoli Item in un RS in memoria...!
Cioè l'alternativa proposta all'inizio :P
Ciao 

 Ciao
Se trovi una soluzione diversa la brevettiamo...!
;-)
@Alex

 perchč dovrei avere 2 recordset con la solita roba???
Ad esempio in un recordset gerarchico (shaped) per duplicare una colonna di tipo
adChapter (che č a sua volta un RS) da un record all'altro.
Comunque anch'io ho dovuto fare il doppio loop records/fields, non si scappa.
My 2 cents
Raf

Anch'io ho avuto lo stesso problema.
Il mio caso prevedeva 2 tabelle
Una di produzione ed una temporanea
Il programma lavora sulla temporanea e quando ha finito passa i record alla 
tabella di produzione.
Questo per evitare di sporcare o modificare o altro i dati nella tabella di 
produzione.
La struttura è la stessa per tutte e due le tabella.
Purtroppo io avevo aperto le due tabelle e ciclavo la tab. temporanea e 
scrivevo su quella di produzione.
Ma mi ero chiesta se esisteva una cosa tipo
    Data1.DatabaseName = Connetti_TMP
    Data2.DatabaseName = Connetti
    sql = "SELECT * FROM TMPPRODUZ"
    Data1.RecordSource = sql
    Data1.Refresh
    sql = "SELECT * FROM PRODUZ"
    Data2.RecordSource = sql
    Data2.Refresh
    Mi sarebbe piaciuto una cosa tipo
    WHILE Not Data1.Recordset.EOF
        DATA2.RECORDSET.ADDNEW
 questo -->       DATA2.RECORDSET = DATA1.RECORDSET
 anzichè -->   Data2.Recordset("camp1") = Data1.Recordset("camp1")
 Data2.Recordset("camp1") = Data1.Recordset("camp1")
 Data2.Recordset("camp1") = Data1.Recordset("camp1")
 Data2.Recordset("camp1") = Data1.Recordset("camp1")
        DATA2.RECORDSET.UPDATE
        DATA1.RECORDSET.MOVENEXT
    WEND

Fabio ha scritto:

'// Variabili - Oggetti
    Dim cn      As ADODB.Connection
    Dim rs1     As ADODB.Recordset
    Dim rs2     As ADODB.Recordset
    '// Connessione al database
        Set cn = New ADODB.Connection
        With cn
             .Provider = "Microsoft.Jet.OLEDB.4.0;"
             .Properties("Data Source") = "database"
             .Open
        End With
    '// Crea il primo recordset
        Set rs1 = New ADODB.Recordset
            rs1.Open "SELECT NomeCampi FROM NomeTabella", cn
        '// Aggiungi un campo del recordset alla lista1
            Do While True
               If rs1.EOF Then Exit Do
               List1.AddItem rs1.Fields![NomeCampo]
               rs1.MoveNext
            Loop
            rs1.Close
        '// Crea la copia del recordset
            Set rs2 = rs1
        '// Apre il recordset 2
            rs2.Open
        '// Aggiungi un campo del recordset alla lista2
            Do While True
               If rs2.EOF Then Exit Do
               List2.AddItem rs2.Fields![NomeCampo]
               rs2.MoveNext
            Loop
            rs2.Close
    '// Chiude la connessione
        cn.Close
    '// Rilascia tutto
        Set rs1 = Nothing
        Set rs2 = Nothing
        Set cn = Nothing
Ciao


Sinceramente io avevo già trovato questa soluzione, però magari qualcuno 
conosceva un trucchetto che faceva la copia diretta:
    Set objStream = New Stream
    Call Source.Save(objStream, adPersistXML)
    Set rsCopia = New Recordset
    rsCopia.Open objStream
Ciao 


Bello... evvero che si poteva fare così, però poi ti conserva tutte tutte tutte
le proprietà del recordset origine (es. AUTOINCREMENT)?
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.


Ma per fare tutto 'sto malippo bastava una query
INSERT INTO PRODUZ SELECT * FROM TMPPRODUZ
;-)


Il 19 Oct 2006 17:53:36 +0200, Fabio ha scritto:

Tiè guarda se adattando questa TIP di Balena ci cavi le gambe!
http://www.devx.com/vb2themax/Tip/18431

 
http://www.devx.com/vb2themax/Tip/18431
Eh, Balena č sempre Balena... utilissimo, grazie!
(non si finisce mai di imparare, mai usata una propertybag in vita mia al di
fuori di usercontrols)
Ciao
Raf


ma che cavolo.. non lo sapevo.
grazie.

 Raf
Illuminante come la trascendenza del Buddha....
@Alex

 Eh, Balena è sempre Balena...
[...CUT...]
Giusto per pignoleria, il tip in questione è anche presente nel vituperato
"I trucchi di VB6" (Portatili Mondadori, 10.70 Eure - pag. 229), tanto
disdegnato dai Programmatori Professionisti (quelli che contano fino a 1024
sulle dita delle mani...).
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 sulle dita delle mani...).
Beh, adesso che l'ha detto Balena questo tip viene riclassificato da 
"accrocchio" a "soluzione geniale".
Ciao