Newsgroup: it.comp.lang.visual-basic
Titolo: Copiare tabelle tra due database Sqlserver

Salve a tutti.
Devo fare un poiccolo eseguibile che allinea la notte due database
sqlserver.
Leggo le tabelle da allineare.. (anagrafica dipendente, anagrafica
impresa, ecc..), cancello con una "delete from tabella" le righe sul
database pubblicato sul web e riscrivo le righe leggendo dal database
locale.....
va tutto bene per tabelle sotto i 50000 records ma oltre il commit
della transazione(=>dopo le delete e la copia dei records) mi
restituisce questo errore:
" Il trasporto ha perso la connessione al server."
Allego il codice di allineamento
Grazie a tutti per qualsiasi suggerimento
Private Sub Allinea()
    Dim Ini As String
    Dim nomeColonna As String
    Dim ps_Utente As String
    Dim i As Long
    Dim dataUltimoAggiornamento As String
    Dim dbApertoWeb As Boolean
    Dim dbApertoEdilnet As Boolean
    Dim count As Long
    Dim rst1 As Recordset
    Dim temp As String
    Dim FileDBPath As String
    Dim strSql As String
    Dim rstDaInserire As Recordset
    Dim rstWeb As Recordset
     Dim c As ADODB.Recordset
    Dim completa As String
    ps_Utente = "cfp"
    Ini = "allinea.ini"
    completa = "S"
    completa = Leggi_File_ini(Ini, "Archivi", "Completa")
      '''''''''''DATI WEB''''''''''''''''
      ps_ServerSQLWeb = Leggi_File_ini(Ini, "Archivi", "ServerSQLWeb")
      If ps_ServerSQLWeb = "" Then
        MsgBox "ServerSQL non specificato nel file " & Ini, vbCritical
        End
      End If
      ps_DBServerSQLWeb = Leggi_File_ini(Ini, "Archivi",
"dbServerSQLWeb")
      If ps_DBServerSQLWeb = "" Then
        MsgBox "DBServerSQL non specificato nel file " & Ini,
vbCritical
        End
      End If
      ''''''''DATI EDILNET'''''''''
      ps_ServerSQLEdilnet = Leggi_File_ini(Ini, "Archivi",
"ServerSQL")
      If ps_ServerSQLEdilnet = "" Then
        MsgBox "ServerSQL non specificato nel file " & Ini, vbCritical
        End
      End If
      ps_DBServerSQLEdilnet = Leggi_File_ini(Ini, "Archivi",
"dbServerSQL")
      If ps_DBServerSQLEdilnet = "" Then
        MsgBox "DBServerSQL non specificato nel file " & Ini,
vbCritical
        End
      End If
      Set ConnWeb = New ADODB.Connection
      ConnWeb.ConnectionTimeout = 0
      ConnWeb.Provider = "SQLOLEDB"
      temp = "DATABASE=" & ps_DBServerSQLWeb & ";OLE DB
Services=-4;SERVER=" & ps_ServerSQLWeb
      temp = temp & ";UID=XXXXX;PWD=XXXXX"
      ConnWeb.ConnectionString = temp
      ConnWeb.Open
      dbApertoWeb = True
      Set ConnEdilnet = New ADODB.Connection
      ConnEdilnet.CommandTimeout = 0
      ConnEdilnet.ConnectionTimeout = 0
      ConnEdilnet.Provider = "SQLOLEDB"
      temp = "DATABASE=" & ps_DBServerSQLEdilnet & ";OLE DB
Services=-4;SERVER=" & ps_ServerSQLEdilnet
      temp = temp & ";UID=XXXXXX;PWD=XXXXX"
      ConnEdilnet.ConnectionString = temp
      ConnEdilnet.Open
      dbApertoEdilnet = True
      If Not dbApertoWeb Then
        MsgBox "Impossibile aprire il database Web!", vbCritical
        End
      End If
      If Not dbApertoEdilnet Then
        MsgBox "Impossibile aprire il database Edilnet!", vbCritical
        End
      End If
      ConnEdilnet.CursorLocation = adUseClient
      ConnWeb.CursorLocation = adUseClient
    If dbEsiste_Tabella("allineamento", ConnWeb) Then
        strSql = "Select tabella from allineamento order by ordine
asc"
        Set rst1 = dbApri_SQL(strSql, ConnWeb, adOpenKeyset,
adLockPessimistic)
        If Not rst1.BOF And Not rst1.EOF Then
            If rst1.RecordCount > 0 Then
         On Error GoTo errore
                Do While Not rst1.EOF
                    DoEvents
                    tabella = rst1.Fields("tabella")
                    dbInizioTrans ConnWeb, TransInCorsoWeb
                        strSql = "delete from " & tabella
                   sbStato.SimpleText = strSql
                   Set c = dbApri_SQL(strSql, ConnWeb)
                    lblTabella.Caption = "TABELLA DA ALLINEARE " &
tabella
                    strSql = "SELECT * from " & tabella
                    Set rstDaInserire = dbApri_SQL(strSql,
ConnEdilnet, adOpenKeyset, adLockPessimistic)
                    strSql = "SELECT * from " & tabella
                    Set rstWeb = New ADODB.Recordset
                    rstWeb.Open strSql, ConnWeb, adOpenKeyset,
adLockOptimistic
                    If rstDaInserire.RecordCount > 0 Then
                        count = 1
                        Do While Not rstDaInserire.EOF
                           DoEvents
                            sbStato.SimpleText = "record inseriti " &
count & " di " & rstDaInserire.RecordCount
                            rstWeb.AddNew
                            For i = 0 To rstWeb.Fields.count - 1
                                nomeColonna = rstWeb.Fields(i).Name
                                rstWeb.Fields(nomeColonna).Value =
rstDaInserire.Fields(nomeColonna).Value
                            Next i
                            rstWeb.Update
                            rstDaInserire.MoveNext
                            count = count + 1
                        Loop
                    End If
                    sbStato.SimpleText = "Commit transazione"
                    dbFineTrans ConnWeb, TransInCorsoWeb
                With CDO
                    .Subject = "Allineamento database  " &
ps_DBServerSQLWeb
                    .TextBody = "Allineamento tabella  " & tabella & "
completato"
                    .Send
                End With
                    rst1.MoveNext
                    rstWeb.Close
                    Set rstWeb = Nothing
                Loop
                sbStato.SimpleText = "record inseriti " & count & " di
" & rstDaInserire.RecordCount & " ora fine " & Now
                With CDO
                    .Subject = "Allineamento database  " &
ps_DBServerSQLWeb
                    .TextBody = "Allineamento database  " &
ps_DBServerSQLWeb & " completato"
                    .Send
                End With
            Else
                With CDO
                    .Subject = "Errore database  " & ps_DBServerSQLWeb
                    .TextBody = "NON CI SONO TABELLE DA ALLINEARE"
                    .Send
                End With
                End
            End If
        End If
    Else
        With CDO
         .Subject = "Errore database  " & ps_DBServerSQLWeb
         .TextBody = "Manca la tabella allineamento sul database: " &
ps_DBServerSQLWeb & " server:" & ps_ServerSQLWeb
         .Send
        End With
        End
    End If
Exit Sub
errore:
    dbAnnullaTrans ConnWeb, TransInCorsoWeb
    With CDO
         .Subject = "Errore database  " & ps_DBServerSQLWeb
         .TextBody = "Allineamento database  " & ps_DBServerSQLWeb & "
" & Err.Description & "Tabella " & tabella & " riga " & count
         .Send
    End With
End Sub
Public Function dbApri_SQL(Query As String, conn As ADODB.Connection,
_
                Optional TipoRecordset As ADODB.CursorTypeEnum, _
                Optional TipoLock As ADODB.LockTypeEnum, _
                Optional Opzioni) As Recordset
On Error GoTo ErroreSQL
'* commTT
'*
'* Scopo   :
'*
'*
'*
'*
'*
'* Accetta :
'*
'*
'*
'* Ritorna :
                Dim cmd As New ADODB.Command
                With cmd
                    .ActiveConnection = conn
                    .CommandTimeout = 0
                    .CommandText = Query
                    .CommandType = adCmdText
                End With
    If Query = "" Then
      MsgBox "Query Nulla!", vbCritical
      Exit Function
    End If
    If conn Is Nothing Then
      MsgBox "dbApri_SQL: connessione ADO non aperta!", vbCritical
      Set dbApri_SQL = Nothing
      Exit Function
    End If
    Set rstADO = New ADODB.Recordset
    If TipoRecordset = 0 And IsMissing(Opzioni) And TipoLock = 0 Then
      'Set dbApri_SQL = dba.OpenRecordset(Query)
      ' il default di ADO e' forwardonly, ma noi usiamo dynaset
     ' rstADO.Open Query, conn, adOpenDynamic
      Set rstADO = cmd.Execute()
    ElseIf IsMissing(Opzioni) And TipoLock = 0 Then
      'Set dbApri_SQL = dba.OpenRecordset(Query, TipoRecordset)
      'rstADO.Open Query, conn, TipoRecordset
        Set rstADO = cmd.Execute()
    ElseIf IsMissing(Opzioni) Then
      'Set dbApri_SQL = dba.OpenRecordset(Query, TipoRecordset,
Opzioni)
      'rstADO.Open Query, conn, TipoRecordset, TipoLock
        Set rstADO = cmd.Execute()
    Else
      'Set dbApri_SQL = dba.OpenRecordset(Query, TipoRecordset,
Opzioni, TipoLock)
      'rstADO.Open Query, conn, TipoRecordset, TipoLock, Opzioni
        Set rstADO = cmd.Execute
    End If
    Set dbApri_SQL = rstADO
   ' recordCont = rstADO.RecordCount
  Exit Function
ErroreSQL:
    dbAnnullaTrans ConnWeb, TransInCorsoWeb
    With CDO
         .Subject = "Errore database  " & ps_DBServerSQLWeb
         .TextBody = "Allineamento database  " & ps_DBServerSQLWeb & "
" & "Errore " & Err.Number & " " & Err.Description & "Tabella " &
tabella & " riga " & count
         .Send
    End With
    Screen.MousePointer = vbDefault
    Exit Function
End Function

 Grazie a tutti per qualsiasi suggerimento
Non ho voglia di leggere tutto il codice, ma ho visto
Rs.AddNew e Rs.RecordCount.
Decisamente da evitare secondo me.
Crea #n righe SQL del tipo
INSERT INTO
e lancia quelle, sicuramente avrai meno problemi.

 e lancia quelle, sicuramente avrai meno problemi.
Posso anche provare ma prima di "perdere tempo" aggiungo che il
problema non è il metodo addnew (=>la insert nella tabella) che scrive
correttamente ma il commit che s'interrompe per tabelle che contengono
molti dati....

 molti dati....
Io con firebird avevo problemi ad usare AdoCN.CommitTrans ecc.
Forse č qualche problema del genere.