处理多个 类 中使用的 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();
我正在使用 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();