.net 同一应用程序的MySQL和SQL Server

.net 同一应用程序的MySQL和SQL Server,.net,database,enterprise-library,.net,Database,Enterprise Library,在不实际编码两个DAL的情况下,实现DB不可知论的好方法是什么?我听说数据访问应用程序块适用于此。您还可以查看各种ORM库,如NHibernate。当您针对多个数据库时,最好寻找一个可以从配置文件或代码创建数据库的工具。这将避免您必须在MySQL和MSSql中创建相同的数据库。使用用于MySQL的ADODB抽象库。本机MySQL库调用非常丑陋和原始,因此在任何情况下都可能需要更高级别的调用。一个选项是使用System.Data命名空间中的IDbConnection、IDbCommand等类,而不

在不实际编码两个DAL的情况下,实现DB不可知论的好方法是什么?我听说数据访问应用程序块适用于此。

您还可以查看各种ORM库,如NHibernate。当您针对多个数据库时,最好寻找一个可以从配置文件或代码创建数据库的工具。这将避免您必须在MySQL和MSSql中创建相同的数据库。

使用用于MySQL的ADODB抽象库。本机MySQL库调用非常丑陋和原始,因此在任何情况下都可能需要更高级别的调用。

一个选项是使用System.Data命名空间中的IDbConnection、IDbCommand等类,而不是SQL Server特定的类(SqlConnection、SqlCommand)进行编码来自System.Data.SqlClient或相应的MySQL特定类。您仍然需要为正在使用的特定数据库创建连接类的实例,但从那时起,您可以只使用通用接口


还有一些示例代码。

正如其他人所指出的,试着将自己从实际涉及的类中抽象出来。这可能涉及使用接口,如AHd54所指出的,或者类似的东西

但这只会让你半途而废

您需要执行的SQL也会有所不同,如下所示:

  • 参数名语法
  • 位置参数与命名参数
  • 函数名
  • 一些语法差异,比如如何指定只给我前N行
如果您需要涵盖所有这些内容,并且不能或不愿使用ORM(尽管它们很少100%实现),那么一种方法是创建自己的类,不仅抽象出实际涉及的类,而且还进行某种类型的SQL重写来处理代码差异


我已经走上了重写的道路,因此,如果您需要关于这方面的指针,请在此答案上添加一条带有问题的注释,我将相应地更新答案。

使用ERD图表工具构建一个纯逻辑设计,然后让它为您的每个选项生成DDL

您可以签出DBDesigner


ORM框架将帮助您实现RDBMS不可知的基础架构,但如果您使用UDF和存储过程,您仍然必须保持DAL的独立性。因此,您可能不会使用触发器、T-SQL、更新视图和CLR托管的C#代码。您只需映射实体和对象

ADO.NET在大多数项目中都能很好地运行。如果您需要在MSSQL或MySQL之间切换,您可以像下面这样轻松地实现与提供商无关的访问:

    private static DbProviderFactory _provider = DbProviderFactories.GetFactory(WebConfigurationManager.ConnectionStrings["database"].ProviderName);
    private static string _connectionString = WebConfigurationManager.ConnectionStrings["database"].ConnectionString;


    public static DbParameter CreateParameter(string name, object value)
    {
        DbParameter parameter = _provider.CreateParameter();
        parameter.ParameterName = name;
        parameter.Value = value;
        return parameter;
    }

    public static DataTable SelectAsTable(string query, DbParameter[] parameters)
    {
        using (DbConnection connection = _provider.CreateConnection())
        {
            connection.ConnectionString = _connectionString;
            using (DbDataAdapter adapter = _provider.CreateDataAdapter())
            {
                adapter.SelectCommand = connection.CreateCommand();
                adapter.SelectCommand.Parameters.AddRange(parameters);
                adapter.SelectCommand.CommandText = query;

                DataTable table = new DataTable();
                adapter.Fill(table);
                connection.Close();
                return table;
            }
        }
    }
最好的方法是使用O/RM工具(事实上通常是任何数据库访问层)。我更喜欢ActiveRecord,它是nHibernate的包装

下面是一些使用AR的示例源代码

net是专门为解决这个问题而设计的。通过提供一个“provider”类来处理所有的db交互,并从一个设计良好的基类派生出来,您可以用最小的努力交换后端提供程序(用于sql、mySql(blech)、xml或任何东西)


而且,根据我的经验,ORM生成的代码无法与有能力的开发人员编写的代码相竞争,并且通常会产生更多的维护问题,需要解决。ORM是另一个抽象层,有助于生成更慢、资源更密集的代码,这些代码只对那些不熟悉SQL的内部和外部的人来说是必需的。

如果它也处理oracle,那就有额外的好处了。好吧,它直接处理oracle。添加mySQL很简单,即使没有CodePlex上的预构建提供程序也是如此。ORM特别擅长使涉及的sql非常简单。首先,您不太可能使用特定于数据库的功能或实现细节。您还可以针对SQLLite编写集成测试,以确保不会出现任何问题。我喜欢引擎无关的数据模型,并一起生成数据库架构和代码。