【问题标题】:What is the best way to handle multiple database connections in C#在 C# 中处理多个数据库连接的最佳方法是什么
【发布时间】:2009-06-05 23:17:30
【问题描述】:

如果说我需要针对两个单独的数据库运行两个单独的 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 命令/数据库连接创建一种方法?
  • 我会使用使用块来处理关闭/处置问题,但除此之外,这个想法是合理的。我会问为什么你需要同时引用所有这些 - 为什么不三个单独的调用,分成不同的方法,全部连续调用?
  • 是的,我不需要同时打开连接。所以我可以创建一个通用方法,它接受一个连接变量和一个 SQL 命令变量,也许还有一个 SQL 字符串,并在方法内执行查询?这样一来,一切都变得更整洁了吗?这是一种常见的方法吗?

标签: c# sql database connection


【解决方案1】:

与其添加变量,不如创建一个类?

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】:

    如果您要进行低级数据库访问,这对我来说似乎很好。当然,如果您在任何时候只需要打开一个数据库连接,您可以将大部分代码抽象成一个方法(以 SQL 命令/文本作为参数并返回结果),但情况可能并非如此你的情况。

    您还可以通过使用using 语句使事情变得更整洁,例如:

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

    【讨论】:

      【解决方案3】:

      如果您需要同时打开所有两个(或三个,或...)连接,并且需要为每个连接保留 SqlCommand,那么是的,您可能必须按照您的方式进行操作正在做。

      但是,如果您一次只需要打开一个连接,您可以使用单个连接和单个命令,然后根据需要进行更改。

      【讨论】:

      • 嗯好的。我不需要同时打开两个连接。所以我会保留一个连接变量和一个sqlCMD变量,依次重新分配给不同的数据库。因此,如果我需要对数据库 1 运行 SQL 语句 1,然后对数据库 2 运行 SQL 语句 2,然后再次对数据库 1 运行 SQL 语句 1。我需要重新分配连接和 cmdSQL 变量 3 次?
      • 没错。 SqlCommand.Connection 属性和 SqlCommand.CommandText 属性每次都需要更改。例如,您可以将它们中的每一个放在一个数组中,然后使用 for 循环以编程方式更改内容(而不是将代码更改重复三次)。
      猜你喜欢
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      相关资源
      最近更新 更多