C# - BD : mode connecté ou non-connecté
Bonjour,
J'ai réalisé un code en application console qui permet de répliquer une base de données Oracle vers une base de données MySql.
Voici mon principe :
*Ouverture des connexions aux BD (Oracle et MySql)
*Lister toutes les tables Oracle et les stocker dans un tableau créé dynamiquement en fonction du nombre de tables listées
*Boucler sur le tableau pour traiter chaque table Oracle séparément
*Récupérer le schéma de la table courante Oracle (nom, type, longueur, nullable)
*Vérifier la présence de la table courante Oracle dans MySql
*Si la table courante n'existe pas dans MySql, je la crée avec son schéma associé
*Si la table courante existe dans MySql, je vérifie que le schéma est identique
*Ensuite, je boucle sur le tableau qui contient le schéma de la table courante pour pouvoir traiter chaque colonne séparément. Je fais un SELECT pour obtenir toutes les lignes de la colonne courante de la table courante ET l'ID correspondant (qui est tout simplement la 1ère colonne de la table).
*Je vérifie la présence de l'ID dans la table MySql
*Si l'ID n'existe pas, je le crée
*J'update les valeurs en fonction de l'ID
*Fermeture des connexions aux BD
J'utilise à chaque fois des DataReader, et dès que je sors de la boucle qui me permet de récupérer les données, je réalise un "dispose()" pour libérer les ressources. Exemple :
Code:
1 2 3 4 5 6 7 8 9 10
| Mcmddata = "UPDATE " + tname[i] + " SET " + tschemaO[j, 0] + " = @data WHERE " + tschemaO[0, 0] + " = @id";
//Console.WriteLine("La requete d'update est : " + Mcmddata);
cmdupdata = Command(Mcmddata, Mconnect);
cmdupdata.Parameters.Add(AjoutParametre("@id", Odata[tschemaO[0, 0]].ToString(), cmdupdata));
cmdupdata.Parameters.Add(AjoutParametre("@data", Odata[tschemaO[j, 0]].ToString(), cmdupdata));
ExecuteNonQuery(cmdupdata);
cmdupdata.Dispose();
} |
ou
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| string[,] tschemaM = new string[1, 3];
string cmd = "SHOW FIELDS FROM " + tname[i] + " WHERE FIELD=@nomchamps";
DbCommand McmdSchema = Command(cmd, Mconnect);
McmdSchema.Parameters.Add(AjoutParametre("nomchamps", tschemaO[j, 0], McmdSchema)); //tschemaO[j,0] contient le nom d'un champs d'une table
//Console.WriteLine("La table MySql est : " + tname[i]);
//Console.WriteLine("Le champs MySql est : " + tschemaO[j,0]);
DbDataReader MSchemaReader = ExecuteQuery(McmdSchema);
int cptrowMSchema = 0;
while (MSchemaReader.Read())
{
//Console.WriteLine("je passe dans le while");
cptrowMSchema++;
tschemaM[0, 0] = MSchemaReader["Field"].ToString();
tschemaM[0, 1] = MSchemaReader["Type"].ToString();
tschemaM[0, 2] = MSchemaReader["Null"].ToString();
}
MSchemaReader.Dispose(); |
Ma base de données Oracle est assez conséquente : 145 tables, + de 20000 lignes / table, et un nombre de colonnes qui varient de 5 -> 60...
Après 4h, la 3ème table n'est toujours pas complète.
Je me demandais s'il ne serait pas plus rapide d'utiliser des DataSet plutôt que des DataReader comme je fais et d'ouvrir/fermer les connexions quand j'en ai besoin.
Merci.