繁体   English   中英

在C#/ ADO.NET中抽象出DB Server类型

[英]Abstracting away DB Server type in C#/ADO.NET

C#/ ADO.NET具有:

SqlConnection / NpgsqlConnection / ...
SqlCommand / NpgsqlCommand / ...
SqlDataReader / NpgsqlDataReader / ...
...

这意味着您所有的数据库代码最终都是特定于数据库供应商的。 如果更改数据库供应商,则必须更改所有数据库调用。 而且,您不能使您的代码数据库供应商不可知。

我不介意创建数据库供应商特定的连接,但是从那时起,我希望所有数据库调用都是通用的,例如Command和DataReader。

我知道我可以通过创建Command和DataReader等类来做到这一点,这些类可以包含调用适当的供应商特定调用的switch语句,但是我宁愿做些更优雅的事情。 我感觉到一种标准的设计模式可能会有所帮助,但是我还没有找到一种优雅的解决方案。 任何帮助将不胜感激。

这意味着您所有的数据库代码最终都是特定于数据库供应商的。 如果更改数据库供应商,则必须更改所有数据库调用。 而且,您不能使您的代码数据库供应商不可知。

是。 除非您阅读文档并意识到它们都实现了通用接口。 它所需要的只是一种易于替换的小型工厂方法。

然后问题开始了。 SQL方言是非常不同的,参数的附加方式(不是C#部分-而是如何在SQL代码中命名和引用它们)。

易于标准化的编程接口完全是微不足道的。

除了使用完整的驱动程序模型外,没有其他方法可以概括SQL级别,即具有一个抽象(如LINQ),然后使用特定的生成器从那里获取它。

    abstract class AbstractFactory  {
        public abstract System.Data.Common.DbConnection CreateConnection(string cs);
        public abstract System.Data.Common.DbCommand  CreateCommand(string stmt, System.Data.Common.DbConnection conn);
    }

    class ConcreteFactorySql : AbstractFactory {
        public override System.Data.Common.DbConnection CreateConnection(string cs) {
            return new SqlConnection(cs);
        }
        public override System.Data.Common.DbCommand CreateCommand(string stmt, System.Data.Common.DbConnection conn) {
            return new SqlCommand(stmt, (SqlConnection) conn);
        }
    }

    class ConcreteFactoryPg : AbstractFactory {
        public override System.Data.Common.DbConnection CreateConnection(string cs) {
            return new NpgsqlConnection(cs);
        }
        public override System.Data.Common.DbCommand CreateCommand(string stmt, System.Data.Common.DbConnection conn) {
            return new NpgsqlCommand(stmt, (NpgsqlConnection) conn);
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM