用于MySQL的C#中的数据库抽象层?

时间:2009-11-04 19:15:39

标签: c# mysql ado.net

我正在尝试使用带有C#的MySQL 5。我在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,但我似乎无法找到一个带有MySQL的ADO.NET的实际例子。

6 个答案:

答案 0 :(得分:5)

自己添加一个抽象...创建一个接口,其中包含您需要检索/添加/删除/更新的数据的方法名称,并使用使用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.
    }
}

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

这里有两件重要的事情要记住:

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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