在C#中处理多个数据库连接的最佳方法是什么?

6

如果我需要针对两个不同的数据库运行两个不同的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变量。

是否有一种“标准”方法来处理这些事情,特别是在效率和性能方面?如果有人能提供一个简单改进的伪代码,那就太好了。

此外,我需要担心实现连接池来节省资源并加快程序速度吗?如果需要,我该如何在这种情况下实现它?

谢谢!


为什么你必须在这个方法中运行所有的命令?为什么不能为每个SQL命令/数据库连接创建一个方法? - Corey Sunwold
我会使用using块来处理关闭/释放问题,但除此之外,这个想法是可行的。我想问一下为什么你需要同时引用它们所有 -- 为什么不将三个单独的调用分割成不同的方法,然后依次调用它们呢? - Jonathan Rupp
是的,我不需要同时打开连接。因此,我可以编写一个通用方法,该方法接受连接变量和 SQL 命令变量,以及可能的 SQL 字符串,并在方法内部执行查询?这样做会使一切更加整洁?这是一种常见的做法吗? - Saobi
3个回答

7

为什么不创建一个类,而不是添加变量?

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

3
如果您需要进行低级数据库访问,我认为这很好。当然,如果您在任何时候只需要一个数据库连接打开,您可以将大部分代码抽象成一个方法(以SQL命令/文本作为参数并返回结果),但在您的情况下可能不是这种情况。
您还可以通过使用using语句使事情变得更加整洁,如下所示:
using(var sqlConnectionA = new ...)
using(var sqlConnectionB = new ...)
{
    try
    {
        // Perform queries here.
    }
    catch (SqlException exSql)
    {
        // SQL error
    }
}

1
如果你需要同时打开两个(或三个,或者更多)连接,并且需要保留SqlCommand的每个连接,那么是的,你可能需要按照你现在的方式来做。
但是,如果你只需要一个连接处于打开状态,你可以使用单个连接和单个命令,然后根据需要进行更改。

嗯,好的。我不需要同时打开两个连接。因此,我将保留一个连接变量和一个sqlCMD变量,并按顺序将它们重新分配到不同的数据库。所以,如果我需要针对数据库1运行SQL语句1,然后针对数据库2运行SQL语句2,然后再次针对数据库1运行SQL语句1。我需要三次重新分配连接和cmdSQL变量吗? - Saobi
1
没错。每次都需要更改SqlCommand.Connection属性和SqlCommand.CommandText属性。例如,您可以将它们中的每一个放入数组中,然后使用for循环来以编程方式更改这些内容(而不是三次重复代码更改)。 - Michael Todd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接