+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 6 su 6

Query su due db residenti su server diversi

  1. #1
    Marcov non è in linea Novello
    Ciao a tutti,
    sono nuovo del forum. Mi ero già iscritto da tempo e credo che sia uno strumento utilissimo per risolvere un sacco di beghe, ma a questa che ho in mano proprio non riesco a trovare soluzione.
    Sto mettendo a punto un progetto windows form in vb .net che mette in confronto i dati provenienti da due db sql situati su due server differenti. La prima versione dell'applicazione girava su access e tramite le tabelle collegate riuscivo a costruire query collegando tabelle residenti su access e tabelle sui db di origine.
    Passando a vb .net ho pensato bene di utilizzare un nuovo bd sql per gestire i dati provenienti dai due db di origine dei dati, e li inserivo con dei cicli for each, il grosso del problema è che anche se funzionano egregiamente la velocità è veramente bassa!
    Posto un esempio di come faccio ora:

    Dim tbl1 As New DataTable
    Dim query1 As String = "SELECT RigaMovimentoContabile.IDRigaMovimentoContabile, ContoPerPDC.IDContoPDC, RigaMovimentoContabile.Segno, RigaMovimentoContabile.Importo,  TestataMovimentoContabile.DataRegistrazione FROM TestataMovimentoContabile INNER JOIN RigaMovimentoContabile ON TestataMovimentoContabile.IDTestataMovimentoContabile = RigaMovimentoContabile.IDTestataMovimentoContabile INNER JOIN CausaleContabile ON TestataMovimentoContabile.IDCausaleContabile = CausaleContabile.IDCausaleContabile INNER JOIN  ContoPerPDC ON RigaMovimentoContabile.IDContoPDC = ContoPerPDC.IDContoPDC INNER JOIN ContoPDC ON ContoPerPDC.IDContoPDC = ContoPDC.IDContoPDC WHERE (CausaleContabile.AutofatturaIntracomunitaria = 'false') AND (TestataMovimentoContabile.IDEsercizio = 42) AND (ContoPDC.CategoriaConto = 1)"
    Dim dmtadp As New SqlDataAdapter(query1, dmt)
    dmt.Open()
    dmtadp.Fill(tbl1)
    dmt.Close()
    Dim dr1 As DataRow
    marcov.Open()
    For Each dr1 In tbl1.Rows
    Dim updiamante As New SqlCommand With {.Connection = marcov, .CommandText = "Insert into transfer (IDRigaMovimentoContabile, IDContoPDC, Segno, Importo,  DataRegistrazione) values (" & dr1(0) & ", " & dr1(1) & ", '" & dr1(2) & "', @impo, @date)"}
    Dim parup1 As New SqlParameter With {.ParameterName = "@impo", .Value = dr1(3), .SqlDbType = SqlDbType.Decimal}
    Dim parup2 As New SqlParameter With {.ParameterName = "@date", .Value = dr1(4), .SqlDbType = SqlDbType.DateTime}
    updiamante.Parameters.Add(parup1)
    updiamante.Parameters.Add(parup2)
    updiamante.ExecuteNonQuery()
    Next
    marcov.Close()
    
    Detto ciò, mi piacerrebbe poter gestire tutto questo processo per fare gli insert into con molto meno codice usando una query del tipo
    INSERT INTO tabella1 (ID,....) SELECT ... from tabella2
    dove la tabella1 è su un server e la tabella2 su un altro, è possibile?

    p.s. Se il codice è più snello meglio ma il topic è avere codice più veloce. quando la prima query carica con il metodo fill la datatable posso anceh avere a che fare con 70/80000 record e la carica in meno di un secondo, poi quando parte il ciclo li rallenta e ci vogliono minuti prima che fa l'insert di tutti i record
    Ultima modifica di AntonioG; 18-01-2017 17:33  Motivo: Usa i tag CODE per il codice

  2. #2
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Devi creare un server collegato
    - apri il SSMS (SQL Server Management Studio)
    - vai su Oggetti server
    - fai clic-destro su Server collegati e seleziona Nuovo server collegato

    a quel punto segui il wizard

    nell'indirizzo del server metterai l'IP del server remoto.

    Creazione di server collegati (Motore di database di SQL Server)
    https://msdn.microsoft.com/it-it/lib...or=-2147217396


    Lo puoi anche collegare via codice, utilizzando la sp_addlinkedserver sul master
    master.dbo.sp_addlinkedserver

    Una volta collegato il server, nelle query accederai alle tabelle con:
    <NomeServerCollegato>.<NomeDatabase>.dbo.<NomeTabe lla>.<campo>

    ℹ️ Leggi di più su gibra ...

  3. #3
    Marcov non è in linea Novello
    Grazie della dritta ci do un occhiata!

  4. #4
    Marcov non è in linea Novello
    Scusa, ma dove lo trovo in visual studio??

  5. #5
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Visual Studio non c'entra nulla.
    In effetti la tua richiesta è posta sul forum sbagliato, non è un problema di Visual Studio ma di SQL SERVER.
    Rileggi con attenzione...
    ℹ️ Leggi di più su gibra ...

  6. #6
    Marcov non è in linea Novello
    Scusa,
    sinceramente pensavo fosse possibile farlo direttamente da codice via vb .net.
    a questo punto ancora studiare, studiare, studiare!!

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Impossibilità di connessione a DB SQL SERVER su 2 PC diversi
    Da giramondo nel forum Microsoft SQL Server
    Risposte: 7
    Ultimo Post: 25-09-2015, 21:25
  2. copia dati tra db diversi sql server 2005
    Da paolob nel forum Microsoft SQL Server
    Risposte: 1
    Ultimo Post: 25-05-2015, 23:51
  3. Query di accodamento che unisca i campi diversi
    Da paoloderigo nel forum Microsoft Word
    Risposte: 4
    Ultimo Post: 14-02-2014, 17:02
  4. VBA Modi diversi per scrivere stringhe di Query
    Da nman nel forum Microsoft Access
    Risposte: 8
    Ultimo Post: 30-07-2012, 08:16
  5. Query accodamento tra DB diversi - Errore chiave primaria
    Da tekkon_84 nel forum Microsoft Access
    Risposte: 3
    Ultimo Post: 26-01-2011, 18:28