处理多个 类 中使用的 Sql 连接的传递

Handeling passing of Sql connection used in multiple classes

我正在使用 Sql 连接来创建临时 table 并对其执行 DML 操作。临时 table 充当暂存区,用于准备要加载到数据仓库中的数据。我正在使用 using 语句,在程序完成(或失败)后正确处理 Sql-连接,如下所示:

using IDbConnection sqlCon = new SqlConnection(connectionString);
sqlCon.Open();
sqlCon.Execute("SELECT 5 AS Number INTO ##TempTable");
sqlCon.Execute("INSERT INTO ##TempTable SELECT 10 AS Number");       

实际上我的查询比这更复杂,需要一些努力来准备。我想将相关工作分成多个 class,以面向对象的方式工作。这可以通过创建以下 classing 来完成:

public class TableCreator
{
    private IDbConnection SqlCon { get; set; }
    
    public TableCreator(IDbConnection conn)
    {
        SqlCon = conn;
    }

    public void CreateTable()
    {
        sqlCon.Execute("SELECT 5 AS Number INTO ##TempTable");
    }
}

public class DataInserter
{
    private IDbConnection SqlCon { get; set; }
    
    public DataInserter(IDbConnection conn)
    {
        SqlCon = conn;
    }

    public void InsertData()
    {
        sqlCon.Execute("INSERT INTO ##TempTable SELECT 10 AS Number");
    }
}

在主要方法中,我可以简单地实例化这些 classes 和 运行 它们的方法,如下所示:

using IDbConnection sqlCon = new SqlConnection(connectionString);
sqlCon.Open();
TableCreator creator = new TableCreator(sqlCon);
stager.CreateTable();
DataInserter inserter = new DataInserter (sqlCon);
inserter.InsertData();

这使代码简洁易读。但是将打开的连接传递给其他 classes 或方法可能不是一个好主意。可能存在实现相同目标的更好方法。

希望大家能给我一些关于这个挑战的建议。有没有一种方法可以将执行命令拆分为单独的 classes,而无需将连接作为参数传递?

我最终创建了一个静态 class 来保存 Sql-connection,因为它可以从任何地方到达。

public static class SqlConnector
{
    public static IDbConnection SqlCon { get; set; }
}

然后我可以重写 TableCreator class,以便像这样长时间保存 Sql-connection:

public class TableCreator
{
    public void CreateTable()
    {
        SqlConnector.SqlCon.Execute("SELECT 5 AS Number INTO ##TempTable");
    }
}

我可以这样重写主要方法:

TableCreator creator = new TableCreator();
DataInserter inserter = new DataInserter();

SqlConnector.SqlCon = new SqlConnection(connectionString);
using IDbConnection SqlCon = SqlConnector.SqlCon;
SqlConnector.SqlCon.Open();

creator.CreateTable();
inserter.InsertData();