Каков наилучший способ обработки нескольких соединений с базой данных в C # - PullRequest
4 голосов
/ 06 июня 2009

Если, скажем, мне нужно запустить два отдельных оператора SQL для двух отдельных баз данных. Прямо сейчас я делаю (псевдокод):

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

Вышеуказанное кажется очень неуклюжим. И если у меня есть три разных оператора SQL, мне понадобятся три разные переменные SQLCmd.

Существует ли «стандартный» способ делать такие вещи, особенно с точки зрения эффективности, производительности? если кто-то может предоставить простой улучшенный псевдокод, это было бы здорово.

Кроме того, нужно ли беспокоиться о реализации пула подключений, чтобы сэкономить ресурсы и ускорить выполнение программы? Если да, то как мне реализовать это в этом случае?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 06 июня 2009

Вместо добавления переменных, почему бы не создать класс?

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

В этом случае легко добавить третье соединение с базой данных

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

И выполнить SQL-запрос для каждого

MyDatabaseConnection[] cons = new MyDatabaseConnection[]{ con1, con2, con3 };
foreach (MyDatabaseConnection con in cons) {
    con.execute(someSqlCommandText);
}
2 голосов
/ 06 июня 2009

Если вы собираетесь осуществлять низкоуровневый доступ к базе данных, мне это кажется правильным. Конечно, если вам нужно только одно соединение с базой данных, открытое в любое время, вы можете абстрагировать большую часть кода в метод (который принимает команду / текст SQL в качестве параметра и возвращает результат), но это может быть не так в ваша ситуация.

Вы также можете сделать вещи немного аккуратнее, используя выражения using, например:

using(var sqlConnectionA = new ...)
using(var sqlConnectionB = new ...)
{
    try
    {
        // Perform queries here.
    }
    catch (SqlException exSql)
    {
        // SQL error
    }
}
1 голос
/ 06 июня 2009

Если вам нужно, чтобы все два (или три, или ...) соединения были открыты одновременно, и вам нужно сохранить SqlCommand для каждого из них, то да, вам, вероятно, придется сделать это так, как вы делаешь это.

Однако, если вам нужно только одно открытое соединение за раз, вы можете использовать одно соединение и одну команду, а затем изменить все по необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...