我正在开发一个 C# 项目,该项目在不同时间从 SQL Server
、ODBC 数据源
和 Oracle 数据库
中提取数据。
此时,我已经创建了 3 个不同的类 - 每种类型的数据库访问各一个。但是,我发现每个库之间 95% 的代码是相同的 - 主要区别在于创建 Connection
和 Command
对象。
作为类中内容的一个非常简单的例子,这里可以是一个例子:
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;
}
}
基本上,我需要从我的每个数据库中获取相同类型的返回数据,并且这样做的方法几乎相同,区别在于Connection
和Command
类型的对象。
现在,当我查看这两个连接对象时,我发现它们都继承自 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;
}
}
这种方法具有附加值,您可以通过创建模拟 DBConnection
和 DBCommand
来测试 exec_DT
而无需 SQLServer 或 Oracle > 然后将其注入(inject)到测试用例中。
关于c# - 为不同数据库之间的共享功能创建通用/抽象 "DBContext"类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30982245/