Domanda

Come al solito, prima alcune informazioni di base:

Database A (Database di accesso): contiene una tabella che contiene le informazioni di cui ho bisogno solo da due colonne. Le informazioni di queste due colonne sono necessarie per un'applicazione che verrà utilizzata dalle persone che non possono accedere al database A.

Database B (Accedi al database): contiene una tabella che contiene solo due colonne (mirror per ciò di cui abbiamo bisogno dalla tabella A). Il database B è accessibile a tutti gli utenti dell'applicazione. Un problema è che i nomi delle colonne non sono gli stessi della tabella del database A.

Quello che devo fare è trasferire i dati necessari tramite un'utilità che verrà eseguita automaticamente, diciamo una volta alla settimana (i due database non devono essere totalmente sincronizzati, solo vicino). L'utilità di trasferimento verrà eseguita da un account utente che ha accesso a entrambi i database (ovviamente).

Ecco l'approccio che ho adottato (di nuovo se c'è un modo migliore, per favore, suggeriscilo):

  1. Prendi i dati dal database A. Sono solo le due colonne dalla tabella necessaria.

  2. Scrive i dati nel file [tablename] .txt usando un oggetto DataReader e un oggetto WriterStream. L'ho fatto in modo da poter utilizzare un file schema.ini e forzare le colonne di dati ad avere lo stesso nome che saranno nel database B.

  3. Crea un oggetto DataSet, contenente una DataTable che rispecchia la tabella dal database B.

  4. Succhiare le informazioni dal file .txt nella DataTable utilizzando il provider Microsoft.Jet.OLEDB.4.0 con proprietà estese di testo, hdr = yes e fmt = delimitato (in modo che corrisponda a come ho schema.ini file setup e file .txt). Sto usando un DataAdapter per riempire la DataTable.

  5. Crea un altro oggetto DataSet, contenente una DataTable che rispecchia la tabella dal database B.

  6. Succhiare le informazioni dal database B in modo che contenga tutti i dati correnti trovati nella tabella che devono essere aggiornati dal database A. Di nuovo sto usando un DataAdapter per riempire questo DataTable (un altro da Passaggio 5, poiché entrambi utilizzano origini dati diverse).

  7. Unisci la DataTable che contiene i dati dal database A (o dal file .txt, tecnicamente).

  8. Aggiorna la tabella del database B con le modifiche.

Ho scritto manualmente l'aggiornamento, l'eliminazione e l'inserimento dei comandi per il DataAdapter che è responsabile della comunicazione con il database B. Tuttavia, questa logica non viene mai utilizzata perché DataSet-From-Database-B.Merge (Dataset-From-TxtFile [tableName]) non capovolge il flag HasChanges. Ciò significa che DataSet-From-Database-B.Update non attiva alcun comando.

Quindi c'è un modo per ottenere i dati da DataSet-From-TxtFile da unire e applicare al database B usando il metodo che sto usando? Mi sto perdendo un passaggio cruciale qui?

So che potrei sempre eliminare tutti i record dalla tabella del Database B e quindi inserire tutti i record dal file di testo (anche se dovessi scorrere in ciclo ogni record nel DataSet e applicare la riga. SetAdded per assicurarsi che attivi il HasChanges flag), ma preferirei applicare SOLO le modifiche ogni volta.

Sto usando c # e il Framework 2.0 (che realizzo significa che posso usare DataTables e TableAdapters invece di DataSet e DataAdapters poiché ho a che fare solo con una singola tabella, ma comunque).

TIA

È stato utile?

Soluzione

Mettendo da parte per un momento che userei SQLServer e ho solo una singola tabella con più viste che controllano chi potrebbe vedere quali informazioni al suo interno per evitare l'intero problema di sincronizzazione ...

Penso che @Mitchel sia corretto qui. Basta scrivere un programma che si collega a entrambi i database, caricare rispettivamente una tabella A e una tabella B. Quindi, per ogni elemento (coppia di colonne) in A, assicurati che sia in B. In caso contrario, inseriscilo in B. Quindi, per ogni elemento in B, assicurati che sia in A. In caso contrario, rimuovilo da B Il salvataggio B. Non vedo prima la necessità di andare su un file.

Pseudocodice:

DataTable A = load table from A
DataTable B = load table from B

foreach row in A
   col1 = row[col1]
   col2 = row[col2]
   matchRow = B.select( "col1 = " + col1 + " and col2 = " + col2)
   if not matchRow exists
      add new row to B with col1,col2
   end
end

foreach row in B
   col1 = row[col1]
   col2 = row[col2]
   matchRow = A.select( "col1 = " + col1 + " and col2 = " + col2)
   if not matchRow exists
      remove row from B
   end
end

update B

Altri suggerimenti

Perché non usare semplicemente un lettore di dati e scorrere i record, inserendo manualmente se necessario nel database B?

Anziché lavorare con set di dati, fusione, ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top