2010-03-05 5 views
1

Lorsque le programme fonctionne 1ère fois, il obtient juste quelques champs d'une table de base de données source disent:comment implémenter Oracle -> conversion oracle/programme de recyclage en C#/ADO.NET 2.0

 
SELECT NUMBER, COLOR, USETYPE, ROOFMATERIALCODE FROM HOUSE; //number is uniq key 

il fait un peu in- Le traitement de la mémoire indique la conversion de USETYPE et ROOFMATERIAL en format de base de données de destination (en utilisant la table de référence croisée).

programme insère ensuite toutes les lignes à destination de la base de données:

 
INSERT INTO BUILDING (BUILDINGID, BUILDINGNUMBER, COLOR, BUILDINGTYPE, ROOFMAT) 
VALUES (PROGRAM_GENERATED_ID, NUMBER_FROM_HOUSE, COLOR_FROM_HOUSE, 
CONVERTED_USETYPE_FROM_HOUSE, CONVERTED_ROOFMATERIALCODE_FROM_HOUSE); 

Ce qui précède est naturellement pas SQL mais vous obtenez l'idée (les valeurs avec underscores décrivent simplement les données insérées).

Les prochaines fois le programme devrait faire la même chose, sauf:

  1. insérer seulement ceux trouvés dans la base de données non cible.
  2. mettre à jour uniquement celles qui ont mis à jour la couleur, le type d'utilisateur, le code de matériau de couverture.

Ma question est:

  1. Comment implémenter dans de manière efficace? -Dois-je d'abord remplir DataSet et convertir les champs au format de destination? -Si j'utilise seulement 1 DataSet comment donner la destination db BUILDING_IDs (puis-je ajouter des colonnes à DataSet rempli?) -Comment vérifier efficacement si les lignes de destination ont besoin d'être rafraîchies (si je les sélectionne un @ temps par BUILDING_NUMBER et cocher tous les champs ça va sois lent)?

Merci pour vos réponses!

-matti

Répondre

1

Si vous utilisez Oracle, avez-vous regardé la déclaration MERGE? Vous donnez un critère à l'instruction de fusion. Si les enregistrements correspondent aux critères, ils effectuent une mise à jour. S'ils ne correspondent pas aux critères (ils ne figurent pas déjà dans la table), ils effectuent un INSERT. Cela pourrait être utile pour ce que vous essayez de faire.

Here est la spécification/exemple de fusion.

+0

Je pense que je crée 2 DataSets. target DataSet est rempli à partir de la base de données cible (1ère fois vide). source DataSet est rempli à partir de la source db. Lorsque les modifications sont en quelque sorte fusionnées pour cibler DataSet, elles sont simplement écrites sur la cible db en appelant AcceptChanges. cette approche a cependant un inconvénient sérieux. cela demande énormément de mémoire. –

+1

Oui, si vous utilisez l'instruction MERGE et l'exécutez directement sur la base de données, vous pouvez vous débarrasser de vos DataSets ADO et ne pas utiliser de mémoire client. –