Newsgroup: it.comp.lang.visual-basic
Titolo: Copia parziale di tabelle

Ciao a tutti.
Essendo nuovo del ng, premetto che potrei anche porre una questione
già trattata in precedenza (anche se l'ho cercata nei precedenti post,
ma non mi pare di averla trovata...); in questo caso, senza insultarmi
troppo, vi sarei moooooolto grato se mi indicaste dove posso prendere
le info che mi servono!!!
Dunque, passiamo ai fatti.
Ho la necessità di creare un piccolo servizio che sincronizzi alcune
tabelle residenti in due DB MSSQL identici, ma su macchine distinte
all'interno di una rete VPN. In particolare, sul DB 'sorgente'
effettuo ad intervalli regolari delle query per prelevare i record
aggiunti a partire dall'ultima sincronizzazione. Questa operazione,
realizzata con un'applicazione scritta in VB6 usando gli ADO,
funziona, tranne che per il fatto di essere estremamente lenta: per
copiare 1000 record a botta, infatti, impiega circa un'oretta (tra la
select d'origine e le insert nel ciclo Do...Loop), che mi pare un
tempo decisamente esagerato.
La mia domanda è questa: esiste un metodo più rapido, usando ADO, per
effettuare la copia dei record aggiunti? Nel caso non ci fosse modo,
quale altro strumento potrei utilizzare (in VB6) per portare a termine
la missione?
Grazie a tutti dell'interessamento (e degli eventuali consigli...)
:-D

 la missione?
A parte connettere un server come linked server sull'altro, in modo da 
poter far eseguire tutto da MSSql a MSSql senza intermediari (ma se la 
vpn non è fissa non è semplicissimo), direi che la strada che stai 
usando è la strada giusta.
Il problema è che cose del genere durano (se parliamo di VPN su ADSL), 
qualche secondo, non minuti come dici tu.
Devi iniziare individuando il passaggio che impiega più tempo. Metti 
dei debug.print cstr(time()) prima e dopo di ogni cosa significativa, e 
poi ne riparliamo.
Alberto
-- 
Thomas Fuller: Ci sono persone che sono state considerate coraggiose 
perchè avevano troppa paura per scappare.

 Grazie a tutti dell'interessamento (e degli eventuali consigli...)
Due domande mi sorgono spontanee,
la rete VPN per che linea passa?
ADSL, fibra, analogica, etere?
Che tipo di dati devi trasportare? dati/numeri di piccola dimensione, 
documenti, immagini, filmati?
Ciao
stefano

 qualche secondo, non minuti come dici tu.
In effetti, la VPN utilizzata è proprio su ADSL, ma tutta
l'elaborazione mi dura un'eternità... ad un'analisi più accurata,
comunque, ho notato che durante le ore notturne, quelle in cui la rete
è meno oberata, il tempo di elaborazione totale si riduce di oltre tre
quarti!!! :-O
...e a questo punto immagino che la risoluzione non sia poi così tanto
vicina!!! :-(

 stefano
Ciao.
Come ho risposto all'altro intervento, la VPN è su ADSL, mentre per i
dati che devo sincronizzare, si tratta di semplicissimi record con
campi numerici e/o di testo, decisamente 'leggeri'... di piccolissima
dimensione!!!

 quarti!!! :-O
E' comunque tantissimo.
Mille record, anche ipotizzando una dimensione enorme del record, 
diciamo 1kB (che per un record non binario è moltissimo), significa 
1MB.
Quanto impiega una ADSL di quelle home da 20Euro al mese, a fare un 
upload di 1MB?
Ipotizziamo, nella peggiore delle ipotesi, un paio di minuti (ma sono 
stato largo). Dalla parte della ricezione non dovrebbe essere un 
problema, il download è sempre più veloce dell'upload.
Quindi, si deve intervenire sulla gestione dei dati.
Partiamo dalle fondamenta:
L'applicativo esegue nella rete di origine o di destinazione?
Se esegue nella rete di origine, sei già nelle condizioni ideali, direi 
che c'è poco altro da fare, se non accertarsi di non chiudere e 
riaprire la connessione ad ogni insert (cosa che in VPN potrebbe 
comportare tempi morti notevoli).
Se esegue nella rete di destinazione, controllerei che i dati vengano 
scaricati con un recordset statico e senza cursori lato server 
(controlla le proprietà del recordset prima dell'apertura, che 
ovviamente non possono essere quelle predefinite che in vpn non vanno 
bene).
Ciao
Alberto
-- 
Konrad Adenauer: All'intelligenza Dio ha posto limiti, alla stupidità 
no.

 dimensione!!!
Come ti è stato già detto,
il tempo che ci impiega è eccessivo.
Alberto ti ha già dato i consigli su che prove fare e come agire.
Ciao
stefano

 bene).
...allora sono proprio nei guai... :'-(
Infatti, il mio applicativo si trova proprio nelle condizioni ideali
(esecuzione nella rete di origine dei dati e apertura della
connessione non su ogni insert)...
Ragionando, però, visto che, come mi dici, i tempi morti tra apertura
e chiusura della connessione sulla VPN possono incidere
sfavorevolmente, potrei evitare di aprire e chiudere la connessione al
DB di destinazione per ognuna delle tabelle: attualmente, infatti,
apro la connessione appena ho il recordset della tabella di origine,
eseguo tutte le insert, dopo di che la chiudo e poi la riapro per la
tabella successiva... A questo punto, non mi rimane altro da fare che
provare ad aprirla una tantum, sincronizzare tutte le tabelle e poi
chiuderla... nella speranza che questo sia sufficiente!!!
Grazie mille per le delucidazioni e... a buon rendere!!! :-D

 chiuderla... nella speranza che questo sia sufficiente!!!
Comunque, i tempi sono spaventosi. Neppure in commutata a 56k si va 
così piano. E visto che ben difficilmente l'insert esegue lentamente su 
un Sql-Server (quantomeno, difficilmente esegue così lentamente, visto 
che hai detto che l'esecuzione in locale è velocissima), resta 
un'ultima possibilità.
Posta il codice esatto del ciclo di insert, soprattutto dove crei la 
stringa SQL contenente INSERT e l'invocazione dell'Execute del Command 
o della Connection.
Proviamo a vedere se non manchi qualche Set che crei una qualche 
connessione implicita...


 Connection.
Mi interesserebbe proseguire l'argomento.


 connessione implicita...
Innanzi tutto, volevo ringraziarti per il tutto il tempo che stai
dedicando al mio problema...
Poi, di seguito ti riporto il pezzo di codice che riguarda la copia
delle tabelle (premetto che non so se sul ng si possono usare dei tag
per evidenziare il codice... non me ne vogliate a male!!!):
Public Function CopiaTabella(strNomeTabella As String, strCondizioni
as String) As Long
Dim cnSQLLocal As New ADODB.Connection
Dim rsSQLLocal As New ADODB.Recordset
Dim strSQLLocal As String
Dim strOpenSQLLocal As String
Dim cnSQLRemote As New ADODB.Connection
Dim strSQLRemote As String
Dim strOpenSQLRemote As String
    strOpenSQLLocal = "Provider=SQLOLEDB.1;Persist Security
Info=False" & _
              ";User ID=pippo" & _
              ";Password=pluto" & _
              ";Initial Catalog=DB1" & strSKIDATANomeDB & _
              ";Data Source=192.160.1.15"
    cnSQLLocal.Open strOpenSQLLocal
    strOpenSQLRemote = "Provider=SQLOLEDB.1;Integrated
Security=SSPI;Persist Security Info=False" & _
              ";User ID=pippo" & _
              ";Initial Catalog=DB2" & _
              ";Data Source=192.101.0.165"
    cnSQLRemote.Open strOpenSQLRemote
    strSQLLocal = " SELECT * FROM dbo." & strNomeTabella & " WHERE ("
& strCondizioni & ")"
    Set rsSQLLocal = cnSQLLocal.Execute(strSQLLocal)
    Do While Not rsSQLLocal.EOF
...
	'Porzione di codice in cui costruisco la stringa dei nomi dei campi e
quella dei relativi valori
...
        strSQLRemote = "INSERT INTO dbo." & strNomeTabella & " " &
strNomeCampi & " VALUES " & strValoreCampi
        cnSQLRemote.Execute strSQLRemote
        rsSQLLocal.MoveNext
        DoEvents
    Loop
    cnSQLLocal.Close
    cnSQLRemote.Close
    Set rsSQLLocal = Nothing
    Set cnSQLLocal = Nothing
    Set cnSQLRemote = Nothing
    CopiaTabella = lngNumeroRecord
End Function
All'esterno, ciclo su tutte le tabelle del DB1 (origine) e chiamo per
ognuna la function CopiaTabella verso il DB2 (destinazione).
C'è da dire che, tra non molto, l'ADSL sarà sostituita da una più
performante HDSL!!! :-D
Resto in attesa di ogni suggerimento migliorativo!!!
Grazie

 performante HDSL!!! :-D
Guarda, l'unica cosa a questo punto è che la tua ADSL abbia una banda 
in upload degna di un telefono a carbonella, perchè come codice mi 
sembra tutto a posto.
Tienici aggiornati.
Saluti
Alberto
-- 
Il tuo stesso identico umore,
ma la divisa di un altro colore

 Saluti
Aggiornerò di sicuro questo post con gli sviluppi futuri.
Grazie ancora e... speriamo bene!!! :-|
Ciao