gpt4 book ai didi

c# - 为不同数据库之间的共享功能创建通用/抽象 "DBContext"类

转载 作者:搜寻专家 更新时间:2023-10-30 22:10:35 26 4
gpt4 key购买 nike

我正在开发一个 C# 项目,该项目在不同时间从 SQL ServerODBC 数据源Oracle 数据库 中提取数据。

此时,我已经创建了 3 个不同的类 - 每种类型的数据库访问各一个。但是,我发现每个库之间 95% 的代码是相同的 - 主要区别在于创建 ConnectionCommand 对象。

作为类中内容的一个非常简单的例子,这里可以是一个例子:

public class Oracle
{
static DataTable exec_DT(string query, string conn_str)
{
DataTable retVal = new DataTable();

using (OracleConnection conn = new OracleConnection(conn_str))
using (OracleCommand cmd = new OracleCommand(query, conn))
{
conn.Open();
using (OracleDataReader rdr = cmd.ExecuteReader())
{
retVal.Load(rdr);
rdr.Close();
}
}

return retVal;
}
}

public class SQLServer
{
static DataTable exec_DT(string query, string conn_str)
{
DataTable retVal = new DataTable();

using (SqlConnection conn = new SqlConnection(conn_str))
using (SqlCommand cmd = new SqlCommand(query, conn))
{
conn.Open();
using (SqlDataReader rdr = cmd.ExecuteReader())
{
retVal.Load(rdr);
rdr.Close();
}
}

return retVal;
}
}

基本上,我需要从我的每个数据库中获取相同类型的返回数据,并且这样做的方法几乎相同,区别在于ConnectionCommand类型的对象。

现在,当我查看这两个连接对象时,我发现它们都继承自 DbConnection:

public sealed class SqlConnection : DbConnection, ICloneable

public sealed class OracleConnection : DbConnection, ICloneable

但我仍然想不出一种创建通用/抽象父类的好方法,因为 DBConnection/DBCommand 类是抽象的,所以可以停止对这种代码重复的需要,当我尝试以下操作时行:

using (DbConnection conn = new DbConnection(conn_str))
using (DbCommand cmd = new DbCommand(query, conn))

我收到诸如 Cannot create an instance of the abstract class or interface 'System.Data.Common.DbCommand' 之类的错误

我是一个新手,任何帮助/示例代码/过去做得很好的方式的链接都将非常非常感激!

谢谢!!!

最佳答案

这里的关键是退一步,换个角度思考问题。您正在复制大量代码,因为您正在方法中创建数据库和命令类的实例。所以注入(inject)它们:

public class SomeDBClass
{
static DataTable exec_DT(DBConnection conn, DBCommand cmd)
{
DataTable retVal = new DataTable();
conn.Open();
using (SqlDataReader rdr = cmd.ExecuteReader())
{
retVal.Load(rdr);
rdr.Close();
}
return retVal;
}
}

这种方法具有附加值,您可以通过创建模拟 DBConnectionDBCommand 来测试 exec_DT 而无需 SQLServer 或 Oracle > 然后将其注入(inject)到测试用例中。

关于c# - 为不同数据库之间的共享功能创建通用/抽象 "DBContext"类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30982245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com