2008-10-24 7 views
3

Comme d'habitude, quelques informations de base d'abord:Comment transférer des données d'une base de données à une autre à l'aide d'un DataSet?

Base de données A (base de données Access) - Contient une table qui a des informations dont j'ai besoin de seulement deux colonnes. Les informations de ces deux colonnes sont nécessaires pour une application qui sera utilisée par les personnes qui ne peuvent pas accéder à la base de données A.

Base de données B (base de données Access) - Contient une table contenant uniquement deux colonnes (des miroirs correspondant à ce dont nous avons besoin dans la table UNE). La base de données B est accessible à tous les utilisateurs de l'application. L'un des problèmes est que l'un des noms de colonnes n'est pas le même que celui de la base de données A.

Ce que je dois faire est de transférer les données nécessaires via un utilitaire qui fonctionnera automatiquement, disons une fois par semaine (les deux bases de données n'ont pas besoin d'être totalement synchronisées, juste proches). L'utilitaire de transfert sera exécuté à partir d'un compte d'utilisateur qui a accès aux deux bases de données (évidemment).

est ici l'approche que j'ai pris (encore une fois s'il y a une meilleure façon, s'il vous plaît suggérer loin):

  1. Grab les données de base de données A. Ce sont seulement les deux colonnes de la table nécessaire.

  2. Ecrivez les données dans le fichier [tablename] .txt en utilisant un objet DataReader et un objet WriterStream. J'ai fait cela afin que je puisse utiliser un fichier schema.ini et forcer les colonnes de données à avoir le même nom que dans la base de données B.

  3. Créer un objet DataSet, contenant un DataTable qui reflète la table Base de données B.

  4. Suce l'information du fichier .txt dans le DataTable en utilisant le fournisseur Microsoft.Jet.OLEDB.4.0 avec des propriétés étendues de texte, hdr = yes et fmt = délimité (pour correspondre à la façon dont j'ai le schéma Configuration du fichier .ini et configuration du fichier .txt). J'utilise un DataAdapter pour remplir le DataTable.

  5. Créer un autre objet DataSet, contenant un DataTable qui reflète la table de base de données B.

  6. sucent dans les informations de la base de données B afin qu'il contient toutes les données actuelles trouvées dans le tableau qui doit être mis à jour de la base de données A. Encore une fois j'utilise un DataAdapter pour remplir ce DataTable (un différent de l'étape 5, car ils utilisent tous deux des sources de données différentes).

  7. Fusionner le DataTable qui contient les données de la base de données A (ou le fichier .txt, techniquement).

  8. Mettre à jour le tableau de la base de données B avec les modifications.

J'ai écrit la mise à jour, supprimer et insérer manuellement les commandes pour le DataAdapter qui est repsonsible pour parler à la base de données B. Cependant, cette logique est jamais utilisé parce que le DataSet-De-Base de données-B.Merge (Dataset -From-TxtFile [tableName]) ne retourne pas l'indicateur HasChanges. Cela signifie que DataSet-From-Database-B.Update ne déclenche aucune des commandes.

Alors est-il possible de fusionner les données de DataSet-From-TxtFile et de les appliquer à la base de données B en utilisant la méthode que j'utilise? Est-ce que je manque une étape cruciale ici?Je sais que je pourrais toujours supprimer tous les enregistrements de la table de la base de données B, puis insérer simplement tous les enregistrements du fichier texte (même si je devais parcourir chaque enregistrement dans le DataSet et appliquer row.SetAdded pour m'assurer qu'il se déclenche le drapeau HasChanges), mais je préfère l'appliquer SEULEMENT les changements à chaque fois. J'utilise C# et le Framework 2.0 (ce que je réalise signifie que je peux utiliser DataTables et TableAdapters au lieu de DataSets et DataAdapters puisque je ne traite que d'une seule table, mais de toute façon).

TIA

Répondre

3

Mis à part un moment que j'utiliser SQLServer et seulement une seule table avec plusieurs vues de contrôle qui pourrait voir quelle information pour éviter toute problème de synchronisation ...

Je pense que @Mitchel est correct ici. Il suffit d'écrire un programme qui se connecte aux deux bases de données, charger une table et une table B, respectivement. Ensuite, pour chaque élément (paire de colonnes) dans A, assurez-vous qu'il est dans B. Sinon, insérez-le dans B. Ensuite, pour chaque élément de B, assurez-vous qu'il est dans A. Sinon, retirez-le de B La sauvegarde B. Je ne vois pas le besoin d'aller à un fichier en premier.

pseudocode:

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 
+0

Le fichier était parce que les noms de colonne étaient différents dans les deux bases de données, donc je ne savais pas comment le DataAdapter réagirait. Avec le fichier, je pourrais forcer les données dans un DataSet avec des noms de colonnes qui correspondraient (en utilisant le fichier schema.ini et en écrivant un en-tête de colonne dans le fichier texte). –

+0

Le pseudo-code est sympa. On dirait que la façon «manuelle» de le faire n'est pas vraiment aussi pénible que je le pensais. Merci tvanfosson. –

0

Pourquoi ne pas utiliser simplement un lecteur de données, et la boucle à travers les dossiers, des insertions manuelles si nécessaire dans la base de données B?

Plutôt que de travailler avec des ensembles de données, fusion, etc ..

+0

Je l'ai considéré, mais je me souviens d'essayer quelque chose de semblable dans le passé et il semblait beaucoup plus lent. En outre, il est possible que certains enregistrements soient supprimés de la base de données A, ils doivent donc être supprimés dans la base de données B. Vous n'êtes même pas sûr que la fusion puisse gérer cela. –

Questions connexes