Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#/ADO.NET中抽象出DB服务器类型_C#_Design Patterns_Ado.net - Fatal编程技术网

在C#/ADO.NET中抽象出DB服务器类型

在C#/ADO.NET中抽象出DB服务器类型,c#,design-patterns,ado.net,C#,Design Patterns,Ado.net,C#/ADO.NET具有: SqlConnection / NpgsqlConnection / ... SqlCommand / NpgsqlCommand / ... SqlDataReader / NpgsqlDataReader / ... ... 这意味着您的所有DB代码最终都是特定于DB供应商的。如果更改数据库供应商,则必须更改所有数据库调用。而且,您不能使您的代码数据库供应商不可知 我不介意创建特定于DB供应商的连接,但从那时起,我希望所有DB调用都是通用的,例如Command和

C#/ADO.NET具有:

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

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

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

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

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

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

易于标准化的编程接口制作起来非常简单


除了使用完整的驱动程序模型,即具有抽象(如LINQ)之外,没有办法概括SQL级别然后使用特定的生成器进行处理。

这就是ADO.NET对DbFactory etc方法所做的,这就是stackoverflow的价值。谢谢!我认为使用我的类而不是DbFactory可能更有意义,原因如下。如果试图使用MS不提供的提供程序(如PostgreSQL),你必须做各种各样的系统配置工作。对于我的代码,这是没有必要的。不,它不是。这些只是抽象类和接口,完全按照你发布的内容来做。没有什么强迫你只使用Microsoft使用的提供程序-已经有一个Postgres提供程序,它是抽象工厂。使用你自己的类只会引入bug并阻止您使用实体框架中的提供者或任何数据库不可知代码我读到的所有内容都说您必须注册一个外来代码(不是MS)provider。我尝试了DbFactory,但出现了错误:找不到请求的.Net Framework数据提供程序。它可能没有安装。--当我使用我的类时,它可以工作。更好的是,ADO.Net实现了公共接口和抽象提供程序类。为了实现新的提供程序,只需要从抽象类继承d仅替换某些部分。实际上并非如此。ADO.NET使用抽象工厂类。如果需要,您只能获得特定于供应商的类,而不是使用DbProviderFactory等。事实上,存在
    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);
        }
    }