Lettura record da tabella A su db locale A e scrittura record estratti da A su tabella B db remoto B sql con Vb 2019

di il
6 risposte

Lettura record da tabella A su db locale A e scrittura record estratti da A su tabella B db remoto B sql con Vb 2019

Buon pomeriggio a tutti,

chiedo il vs aiuto per risolvere un problema che magari ha semplice soluzione ma non la trova dopo molte ricerche.
Vi spiego il contesto:
ho fatto un programma che legge/scrive su due db identici come struttura ma residenti uno su sql server locale A ed uno su pc collegato in rete che chiamo db remoto B. Quando il serve B che chiamo master è on line, tutte le letture e le scritture avvengono su B ed A non lavora
Se B perde la connessione, su A memorizzo i record settando una colonna della tabella chiamata offline a 1.
Fin quì tutto funziona ed ho sviluppato il tutto con ADO.NET con system.data.common namespace.
Ora descrivo la parte che non so come implementare.
Funzionalità: Se il server master B perde la connessione, su A memorizzo i record settando una colonna della tabella chiamata offline a 1. Quando B ritorna on line vorrei scrivere il codice per:
1) fare select della tabella locale su A where offline=1 (non c'è problema)
2) Prendere questi record del punto 1 e scriverli su tabella su db B master(non lo so fare).
La select del punto 1 mi restituisce un datatable, come faccio a versarli tutti con un insert su B(che per è un db diverso da A con un'altra connessione da aprire)?
Stò cercando da molto in rete ma non trovo nulla che fa al caso mio e chiedo aiuto a voi...pleasee..
Perdonatemi ma sono alle prime armi..
Grazie a chiunque vorrà aiutarmi,

Dario

6 Risposte

  • Re: Lettura record da tabella A su db locale A e scrittura record estratti da A su tabella B db remoto B sql con Vb 2019

    Io non l'ho mai fatto ma so che bisogna usare sp_addlinkedserver (sempre che stiamo parlando di SQL Server Microsoft)
    cerca su internet e vedi cosa trovi
  • Re: Lettura record da tabella A su db locale A e scrittura record estratti da A su tabella B db remoto B sql con Vb 2019

    Questa ROBBA e' gia' implementata nei servizi di mirrorign di SQL Servere e di tutti i DBMS semi seri.

    Piuttosto che implementartela a manina (simpatico da fare come esercizio MA per metterlo in produzione e' TUTTA un'altra storia), ti conviene PRIMA vedere come usare AL MEGLIO le funzionalita' messe a disposizione E SOLO DOPO affrontare problemi specifici.

    https://docs.microsoft.com/en-us/sql/database-engine/database-mirroring/database-mirroring-sql-server?view=sql-server-ver15
  • Re: Lettura record da tabella A su db locale A e scrittura record estratti da A su tabella B db remoto B sql con Vb 2019

    Salve a tutti,
    sono d'accordo con @migliorabile, ma capisco che con SQLExpress queste funzionalita' non ci sono... e delle volte puo' andare bene anche "arrangiarsi", anche se i risultati sicuramente saranno lontani da quelli "seri e professionali" forniti nativamente dal dbms...

    non ho mai implementato un log shipping manuale, ma ricordo che gia' nel 2007 Edwin Sarmiento scriveva https://www.edwinmsarmiento.com/your-poor-mans-sql-server-log-shipping/

    mentre lato completamente "client", ADO.Net non mi pare ti permetta "direttamente" quello che stai cercando di fare, ma ovviamente lo puoi raggiungere (piu' o meno )... hai detto che farai sul server di protezione una SELECT ... WHERE [offline] = 1;
    ottieni cosi' sul DataSet il tuo resultset popolato... ovviamente non puoi "direttamente" ribaltarne il contenuto semplicemente cambiando connessione o cose simili, tanto piu' che se anche facessi degli update al resultset per modificarne lo stato e non avere un resultset completamente "statico", avresti un nuovo stato di "update" e non di "addnew"...
    rilsolvibile ad esempio utilizzando un nuovo SqlCommand connesso al server B configurato con tutti i parameters necessari ad effettuare l'insert sulla tabella del server B, quindi ciclando il tuo resultset riga per riga popoli i parameters ed esegui n volte il command di insert...
    a fine operazione, teoricamente, distruggi il command, distruggi il dataset con connessione server A e ripopoli un nuovo dataset con connessione al server B tornato on-line o cose simili...
    tecnicamente non complicato, ma ovviamente NON si basa sulle funzionalita' dei DataAdapter o roba(ccia) simile
    personalmente difficilmente utilizzo funzionalita' di accesso ai dati cosi' dirette... le mie classi di interfacciamento ai dati sono (quasi sempre) collegate a commands che eseguono stored procedures per l'esecuzione di tutte le operazioni CRUD, ed in questo senso non avrei difficolta' a "spostare" l'operazione "sul primo server disponibile" (parolona un po' grossa in quanto ci sarebbero tempi di connessione "valutabili" lato client per la verifica di connessione e/o di down, tempi che potrebbero essere poco apprezzabili )

    my $ 0.02
    salutoni
    --
    Andrea
  • Re: Lettura record da tabella A su db locale A e scrittura record estratti da A su tabella B db remoto B sql con Vb 2019

    Ciao,

    si può usare anche MERGE se è fattibile creare un server collegato

    https://docs.microsoft.com/it-it/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15

    HTH
  • Re: Lettura record da tabella A su db locale A e scrittura record estratti da A su tabella B db remoto B sql con Vb 2019

    Buongiorno a tutti,

    e grazie per le risposte ed il supporto.
    Scusatemi ma mi sono ricollegato solo oggi..Nel frattempo mi fa piacere vedere che ho sondato in autonomia(data la mia poca esperienza) le varie soluzioni che mi avete proposto, a meno del mirroring che non conoscevo ed andrò ad approfondire.
    Ho risolto il problema con una soluzione poco elegante a che funziona benino e mi è servita per esercizio oltre che a risolvere il problema.
    Soluzione implementata:
    1) Per scrivere i record in sospeso da tabella server A a tabella server B, ho implementato come suggerito poi da asql, una funzione che fa select da tabella A e carica su datatable. Successivamente leggo riga per riga il datatable(cella per cella sapendo l'ordine delle colonne) e ompongo la riga che invio a funzione di insert su tabella server B. Al termine dell'insert, cancello tutti i record che ho già allineato.
    2) Ridondanza dei server: per gestire la scrittura su server primario se disponibile ed in caso di fault lo switch su server secondario. Ho implementato una funzione che controlla apre una connessione al primario, se ok, setto bit stato_conn_primario=true altrimenti lo setto a fault e commuto su secondario.
    Sono stato un po sintetico ma questa è la sintesi..se qualcuno volesse maggiori dettagli sono lieto di darli in modo da migliorare ancora la soluzione.
    La base di tutto è che comunque nella mia applicazione non dovrebbero avvenire degli swtich troppo frequenti, altrimenti vuol dire che l'infrastruttura ICT aziendale non funziona bene ed è un problema che bisogna risolvere.

    Funzioni SQL server: Un'altra soluzione molto semplice è quella settare una regola DTS(ciclica) utilizzando la funzione di importazione/esportazione dati di sql server. L'ho provata e funzione. Ovvero si imposta la sorgente dati(server secondario) e si dice che ad ogni ra x del giorno(programmabile) esegue un select tabella server B where offline=1 e ti permette di impostare la destinazione su server diverso.

    Il problema è he la versione expresss non lo permette. Proporrò di comprare una versione base di sql server per avere questa funzione(non so se anche mirroring e replica sono comprese nella prima versione a pagamento).

    Grazie a tutti per il supporto,
    E spero che questa mia discussione possa essere utile a qualcun altro.

    Dario.
  • Re: Lettura record da tabella A su db locale A e scrittura record estratti da A su tabella B db remoto B sql con Vb 2019

    Aggiungo un'altra informazione,

    questa applicazione è a bassissimo contenuto di record..Consideriamo 4 o 5 registrazioni in un giorno, per cui in caso di fault del primario di un giorno avremo un versamento al ritorno della comunicazione di massimo 5x2(fattore di sicurezza)=10 record..
    I dati presenti non sono di sicurezza, ma ciò non toglie che vorrei fare le cose bene e quindi funzioni integrate di sql server con versioni a pagamento sono assolutamente ben accette.
    Grazie a tutti per i consigli
Devi accedere o registrarti per scrivere nel forum
6 risposte