2009-06-05 8 views
4

Si dis je dois exécuter deux instructions SQL distinctes contre deux bases de données distinctes. En ce moment je fais (pseudocode):Quelle est la meilleure façon de gérer plusieurs connexions de base de données dans C#

Try{ 

declare variable connectionA to DatabaseA 
declare variable connectionB to DatabaseB 

connectionA.open() 
connectionB.open() 


declare variable SQLCmdA with ConnectionA and one SQL statement 
declare variable SQLCmdB with ConnectionB and another SQL statement 

SQLCmdA.executeNonQuery() 
SQLCmdB.executeNonQuery() 

} 

Catch() 
{ 
    print error message 
} 

Finally(){ 
    connectionA.close() 
    connectionB.close() 
    SQLCmdA.Dispose() 
    SQLCmdB.Dispose() 
} 

Ce qui précède semble très maladroit. Et si j'ai trois instructions sql différentes, j'aurais besoin de trois variables SQLCmd différentes.

Existe-t-il une manière «standard» de faire de telles choses, notamment en termes d'efficacité et de performance? Si quelqu'un peut fournir un pseudocode amélioré simple, ce serait génial.

En outre, dois-je m'inquiéter de la mise en œuvre de la mise en commun des connexions, pour économiser les ressources et accélérer le programme? Si oui, comment l'implémenter dans ce cas?

Merci!

+0

Pourquoi avez-vous d'exécuter toutes les commandes dans ce méthode? Pourquoi n'avez-vous pas pu créer une méthode par connexion sql command/database? –

+0

J'utiliserais l'utilisation de blocs pour gérer le problème de fermeture/élimination, mais sinon, l'idée est saine. Je demanderais pourquoi vous avez besoin d'avoir des références à tous à la fois - pourquoi pas trois appels distincts, répartis en différentes méthodes, tous appelés successivement? –

+0

Oui, je n'ai pas besoin d'avoir les connexions ouvertes en même temps. Donc, je peux faire une méthode générique qui accepte une variable de connexion et une variable de commande SQL, et peut-être une chaîne SQL, et exécuter la requête à l'intérieur de la méthode? De cette façon, ça rend tout plus propre? Est-ce une façon commune de le faire? – Saobi

Répondre

5

Au lieu d'ajouter des variables, pourquoi ne pas faire une classe?

public class MyDatabaseConnection { 
    public MyDatabaseConnection(string connectionString) { 
     this.connectionString = connectionString; 
     // create a database connection perhaps 
    } 
    // some methods for querying a database 
    public void execute(string query) { } 
} 

Dans ce cas, il est facile d'ajouter une troisième connexion de base de données

MyDatabaseConnection con1 = new MyDatabaseConnection("Server=localhost"); 
MyDatabaseConnection con2 = new MyDatabaseConnection("Server=other_server"); 
MyDatabaseConnection con3 = new MyDatabaseConnection("Server=third_one"); 

et exécuter une requête SQL sur chaque

MyDatabaseConnection[] cons = new MyDatabaseConnection[]{ con1, con2, con3 }; 
foreach (MyDatabaseConnection con in cons) { 
    con.execute(someSqlCommandText); 
} 
1

Si vous avez besoin des deux (ou trois, ou ...) connexions ouvertes en même temps et que vous avez besoin de conserver la SqlCommand pour chacune d'entre elles, alors oui, vous allez probablement devoir le faire tu le fais. Cependant, si vous n'avez besoin que d'une connexion ouverte à la fois, vous pouvez utiliser une seule connexion et une seule commande, puis modifier les choses selon les besoins.

+0

Hmm ok. Je n'ai pas besoin de deux connexions ouvertes en même temps. Je vais donc conserver une variable de connexion et une variable sqlCMD, et les réaffecter séquentiellement à différentes bases de données. Donc, si j'ai besoin d'exécuter l'instruction SQL 1 par rapport à la base de données 1, alors l'instruction SQL 2 par rapport à la base de données 2, puis l'instruction SQL 1 par rapport à la base de données 1. J'ai besoin de réaffecter la connexion et les variables cmdSQL trois fois? – Saobi

+1

C'est correct. la propriété SqlCommand.Connection et la propriété SqlCommand.CommandText doivent être modifiées à chaque fois.Vous pouvez, par exemple, placer chacun d'entre eux dans un tableau, puis utiliser une boucle for pour modifier les choses par programme (plutôt que de dupliquer les changements de code trois fois). –

2

Si vous allez faire un accès bas niveau à la base de données, cela me semble bien. Bien sûr, si vous n'avez besoin que d'une connexion de base de données ouverte à tout moment, vous pouvez extraire la plupart du code dans une méthode (qui prend une commande/texte SQL en paramètre et renvoie le résultat), mais cela peut ne pas être le cas ta situation.

Vous pouvez aussi faire des choses un peu plus propre en utilisant using déclarations, en tant que tels:

using(var sqlConnectionA = new ...) 
using(var sqlConnectionB = new ...) 
{ 
    try 
    { 
     // Perform queries here. 
    } 
    catch (SqlException exSql) 
    { 
     // SQL error 
    } 
} 
Questions connexes