【问题标题】:Database abstraction layer in C# for MySQL?C# for MySQL 中的数据库抽象层?
【发布时间】:2010-12-13 03:45:06
【问题描述】:

我正在尝试将 MySQL 5 与 C# 一起使用。我在 mysql.com 上下载了 MySQL 驱动程序并安装了它。我现在可以使用以下代码在 C# 中连接到 MySQL。

    string ConString = "SERVER=192.168.10.104;";
    ConString += "DATABASE=test;";
    ConString += "UID=user;";
    ConString += "PASSWORD=password;";

    MySqlConnection connection = new MySqlConnection(ConString);

    MySqlCommand command = connection.CreateCommand();
    MySqlDataReader Reader;
    command.CommandText = "select * from j_people";
    connection.Open();

    Reader = command.ExecuteReader();

问题是我以后把数据库服务器改成MS SQL Server或者Oracle怎么办?

C#中没有数据库抽象层吗?

我猜应该是ADO.NET,但我似乎找不到 ADO.NET 与 MySQL 的实际示例。

【问题讨论】:

    标签: c# mysql ado.net


    【解决方案1】:

    自己添加一个抽象...为您需要检索/添加/删除/更新的数据创建一个带有方法名称的接口,并使用一个使用 MySQL 驱动程序的类来实现该接口。如果您以后需要使用不同的连接器(MS SQL Server 或 Oracle),您只需为不同的连接器实现接口。这使得数据访问层是自包含的,并且实现对您的其余代码隐藏。

    您可以使用任何您想要的技术来实现此接口:LINQNHibernate 或 ADO 等。如果数据库管理系统发生变化,这是唯一需要触及的层。

    public interface IDataLayer
    {
        IList<Data> GetData();
        void SaveData(Data dataToSave);
        void DeleteData (Data dataToDelete);
    }
    
    public class MySqlDataLayer : IDataLayer
    {
        public IList<Data> GetData()
        {
            //Use MySQL connector to get data.
            return data;
        }
    
        public void SaveData(Data dataToSave)
        {
            //Use MySQL connector to save to data.
        }
    
        public void DeleteData(Data dataToDelete)
        {
            //Use MySQL connector to delete passed in data.
        }
    }
    

    【讨论】:

    • 我喜欢这个解决方案,因为它开辟了许多可能性。它不仅限于 ADO.NET System.Data.Common 接口。
    【解决方案2】:

    您可以使用 Linq to SQL 提供程序。 BCL 的一个不支持 MySQL,所以你可以使用Linq to SQL provider for MySQL。您也可以使用Entity FrameworkNHibernate

    【讨论】:

      【解决方案3】:

      您也可以查看 iBatis.NET。我认为 iBatis 的学习曲线比 Hibernate / Linq 低,对于小型项目和精通 SQL 的人来说,iBatis 是一个很好的帮手。

      【讨论】:

        【解决方案4】:

        这里有两点需要牢记:

        1. 您可以通过针对 MySql 库实现的接口(即 IDbConnection、IDbCommand、IDataParameters 等)编写代码来使您的特定 .NET 代码与数据库无关。您的总体策略是隔离您使用的点将 MySql 特定的类放到尽可能少的地方(理想情况下,它只能在工厂方法中,以后可以扩展以利用 Oracle、SQL Server 或其他 RDBMS。

        2. 一旦您的 .NET 代码与数据库无关,您传入的 SQL 代码也必须如此。在理想的世界中,所有 RDBMS 都将使用一种通用语言,但不同的提供者存在各种 SQL 的“风格”。简单的 SELECTS、INSERTS 和 UPDATES 可能是可能的,但是您会遇到困难并且需要在很早的时候使用供应商特定的功能。这是您可能会考虑使用 ORM 之类的技术的地方 - 否则,您将需要引入某种分支来为您支持的每个数据库供应商提供特定的 SQL。

        【讨论】:

          【解决方案5】:

          旧文章,但概念可能有用: http://www.informit.com/articles/printerfriendly.aspx?p=25318

          另外,您可能需要考虑实体框架: Using MySQL with Entity Framework

          【讨论】:

            【解决方案6】:

            MySQL .NET 连接器 API 中的类实现了在 System.Data 命名空间(IDbConnection、IDbCommand 等)中定义的与平台无关的接口

            您可以使用Gateway 模式将特定于供应商的数据访问 API 详细信息隐藏在抽象层后面。然后,您可以将 Gateway 实例的创建委托给 Castle、StructureMap 等 IoC 容器。这将允许您在不同的数据访问策略之间进行交换,而无需重构代码。

            【讨论】:

              猜你喜欢
              • 2012-11-22
              • 2010-09-08
              • 2015-05-15
              • 1970-01-01
              • 2012-11-22
              • 1970-01-01
              • 1970-01-01
              • 2011-02-02
              • 2019-07-24
              相关资源
              最近更新 更多