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

标签 c# database generics inheritance abstract-class

我正在开发一个 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/

相关文章:

c# - 在 C# 运行时添加和删除标签页

C# 泛型 - 如何返回特定类型?

database - Perl 中的表游标

c# - 当传输通过 WSS 时,无法使用开箱即用的 XSockets.NET C# API 连接到 XSockets.NET 服务器

mysql - 如何将 VARCHAR 转换为 NVARCHAR mysql?

database - 如何播放从数据库加载的音频?

java - 绑定(bind)不匹配泛型

java - java泛型方法如何约束方法类型参数?

generics - F# 泛型类型重载运算符

c# - LINQ 中的 GroupBy 与字符串 [] 数组