2009-06-05 4 views
4

zu behandeln Wenn ich sage, ich muss zwei separate SQL-Anweisungen gegen zwei separate Datenbanken ausführen. Jetzt mache ich (Pseudocode):Was ist der beste Weg, mehrere Datenbankverbindungen in 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() 
} 

Das oben genannte scheint sehr schwerfällig. Und wenn ich drei verschiedene SQL-Anweisungen habe, würde ich drei verschiedene SQLCmd-Variablen benötigen.

Gibt es eine „standard“ Weg, um solche Dinge zu tun, vor allem in Bezug auf die Effizienz, Leistung? Wenn jemand einen einfachen verbesserten Pseudocode bereitstellen kann, wäre das großartig.

Außerdem muss ich über die Implementierung von Connection Pooling kümmern, Ressourcen zu schonen und das Programm zu beschleunigen? Wenn ja, wie implementiere ich es in diesem Fall?

Danke!

+0

Warum müssen Sie alle Befehle in diesem Lauf ist es einfach hinzufügen Methode? Warum konnten Sie keine Methode pro SQL-Befehl/Datenbankverbindung erstellen? –

+0

Ich würde Blöcke verwenden, um das Problem zu umgehen/zu umgehen, aber ansonsten ist die Idee gut. Ich würde fragen, warum Sie alle Referenzen auf einmal haben müssen - warum nicht drei separate Anrufe, aufgeteilt in verschiedene Methoden, alle nacheinander aufgerufen? –

+0

Ja, ich brauche die Verbindungen nicht gleichzeitig geöffnet zu haben. So kann ich eine generische Methode erstellen, die eine Verbindungsvariable und eine SQL-Befehlsvariable und möglicherweise eine SQL-Zeichenfolge einnimmt und die Abfrage innerhalb der Methode ausführt? Auf diese Weise macht es alles schöner? Ist das ein gängiger Weg? – Saobi

Antwort

5

Stattdessen Variablen hinzuzufügen, warum nicht eine Klasse machen?

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) { } 
} 

In diesem Fall eine dritte Datenbankverbindung

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

und führen Sie eine SQL-Abfrage auf jeder

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

Wenn Sie alle zwei (oder drei oder ...) Verbindungen gleichzeitig öffnen müssen und den SqlCommand für jeden von ihnen behalten müssen, dann müssen Sie es wahrscheinlich so machen du machst es.

Wenn Sie jedoch nur eine Verbindung benötigen zur gleichen Zeit geöffnet, können Sie eine einzelne Verbindung und einzigen Befehl verwenden könnte, dann die Dinge ändern sich je nach Bedarf.

+0

Hmm ok. Ich brauche nicht zwei Verbindungen gleichzeitig geöffnet. Also werde ich eine Verbindungsvariable und eine sqlCMD-Variable beibehalten und sie sequenziell anderen Datenbanken zuweisen. Also wenn ich SQL-Anweisung 1 gegen Datenbank 1 ausführen muss, dann SQL-Anweisung 2 gegen Datenbank 2, dann SQL-Anweisung 1 gegen Datenbank 1 erneut. Ich muss die Verbindung und CmdSQL-Variablen dreimal neu zuweisen? – Saobi

+1

Das ist richtig. Die SqlCommand.Connection-Eigenschaft und die SqlCommand.CommandText-Eigenschaft müssten jedes Mal geändert werden.Sie könnten zum Beispiel jeden in ein Array einfügen und dann eine for-Schleife verwenden, um die Dinge programmatisch zu ändern (anstatt die Codeänderungen dreimal zu duplizieren). –

2

Wenn Sie Low-Level-Datenbankzugriff tun, scheint mir das in Ordnung. Wenn Sie zu irgendeinem Zeitpunkt nur eine Datenbankverbindung benötigen, können Sie natürlich den größten Teil des Codes in eine Methode abstrahieren (die einen SQL-Befehl/Text als Parameter akzeptiert und das Ergebnis zurückgibt), aber dies ist möglicherweise nicht der Fall deine Situation.

Sie auch Dinge etwas sauberere durch den Einsatz von using Aussagen, die als solche machen könnte:

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