多个数据库的ADO.NET或OLE?

时间:2011-12-05 10:39:49

标签: c# .net ado.net

我的任务是编写一个项目来连接多个不同的数据库,如Oracle,SQL Server,Spatialite等,并获取和设置数据值,我想知道你会在标题中选择哪一个推荐这个。

我创建了一个利用OLE功能的类,以便建立连接并设置和检索数据,因为我认为ADO更像是SQL Server特定的技术。是这种情况还是可以将ADO.NET用于各种数据源?我已经研究了很多,我见过的大多数地方都推荐使用多种可能的数据源的OLE,而他们推荐使用ADO for SQL Server。

由于

3 个答案:

答案 0 :(得分:3)

我无法看到OLE如何为统一DAL提供灵丹妙药。您希望使用最适合数据源的数据访问框架,并从应用程序中抽象出实现。

我的猜测是你希望使用OLE将允许一些语法统一。但这种情况并非如此。一旦你尝试做一些像分页这样的事情,每个数据源都会有自己的怪癖,你如何连接到源代码并不能帮助统一语法差异。例如,在分页的情况下,SQLite使用SKIP,TAKE。 Oracle使用ROWNUM。 Sql Server使用TOP。

我会通过创建一个DAL来解决问题,该DAL将实体类从数据源中抽象出来。然后,您可以使用最适合数据源的连接类型。例如,假设我的应用程序想要从数据源检索“产品”。我的应用程序只知道ProductFactory接口,而不是数据源类型的细节。例如,

string id = "0000001";
IProductFactory factory = FactoryManager.GetProductFactory();
Product p = factory.Get(id);

在下面的示例中,我使用ODP.Net(Oracle数据源的最佳数据访问组件)为Product接口实现Oracle数据访问层。然后数据访问层如下所示:

DAL

<强> IProductFactory:

public interface IProductFactory: IEntityFactory
{
    Product Get(string productId);
    IList<Product> GetAll();
    int GetAllCount();
}

<强>产品:

public class Product : IEntity<Product>
{
    public string ProductId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    #region IEntity<Product> Members

    public Product MapData(System.Data.IDataReader reader)
    {
        return new Product
        {
            Name = reader["name"] as string,
            Description = reader["description"] as string
        };
    }

    #endregion
}

Oracle ProductFactory

public class ProductFactory : EntityFactory, IProductFactory
{
    #region IProductFactory Members

    public Product Get(string productId)
    {
        Product p = null;
        using (OracleConnection conn = new OracleConnection(ConnectionString))
        {
            using (OracleCommand cmd = new OracleCommand())
            {
                cmd.CommandText = "select * from product where productId = :productId";
                cmd.Parameters.Add("productId", productId);
                using (IDataReader reader = cmd.ExecuteReader())
                {
                    p = new Product();
                    p.MapData(reader);
                }
            }
        }
        return p;
    }

    public IList<Product> GetAll()
    {
        throw new NotImplementedException();
    }


    public int GetAllCount()
    {
        throw new NotImplementedException();
    }

    #endregion
}

答案 1 :(得分:0)

ADO.NET可用于通过ODBC连接连接到任何数据库。我们几乎可以使用ADO.NET(PostgreSQL,Oracle,MySQL,SQL Server等),它是大多数ORM产品的核心数据库访问方法。

答案 2 :(得分:0)

我建议您通过接口抽象出DAL(数据访问层),然后为每种类型的数据库创建一个DAL。

如果您为DAL私有代码使用基于提供程序的ORM(例如Entity Framework),您的任务将变得更加轻松。

对于公共部分,你所要做的就是实现接口合同,你没事。

相关问题