寻找关于Database-Abstraction-Layer的指针

时间:2010-11-17 20:11:54

标签: c# database delegates

我首先要说的是,在一些项目的过程中,我已经以两种不同的方式实现了这一点,但从未对结果感到满意。

注意:我对使用ORMS感兴趣!

背景

我曾参与许多需要多平台数据库抽象层的项目。回到经典ASP / VBScript的时代,我们有一组函数封装了SQL文本来清理数据,然后构建适合于提供程序的字符串(SQL Server,MSSQL,Oracle,DB2,etceteras)。

快到几年前,我写了一个DAL,用实际的对象取代了所有那些错综复杂的字符串。这个想法很简单,您从抽象的Database类派生了一个数据库类,以根据.NET提供程序处理事物的打开/关闭和执行。还有一个InsertSelectUpdate个对象也适用于提供者。说实话,虽然它有效但软件可以通过对象与任何数据库一起工作,程序员从来不必触摸SQL;它很笨拙。引入新的数据库平台需要时间来创建所有对象。

示例代码:

DB.Database db = DatabasePool.Get();

try
{
    DB.Select select = db.NewSelect("_people"); // MSSQL/Oracle/DB2, doesn't matter
    select.Add("_id");
    select.Add("_people_name");
    select.Where.AndClause("_people_name", DB.Operator.Like, "bob");
    DB.Results results = select.ExecuteToCollection();
    // here, Select is "tailored" to the right DB provider and returns the correct
    // sql.
}
finally
{
    DatabasePool.Release();
}

下一次迭代在这方面有所改进。有一组具体的对象,而不是一个抽象的数据库类和一大堆抽象对象来表示操作。然后,提供商为每种类型提供代理。将对象转换为SQL是将其抛出到Dictionary<Type, Delegate>的简单情况,并且提供程序知道如何将该特定对象(或实际上是整数类型)转换为SQL,同时执行数据清理。一切都很好,我改进了对象的访问器:

DB.Database db = DatabasePool.Get();
try
{
    DB.Select select = new Select(db); // now a sealed, concrete object
    select.Add("_id").Add("_people_name");
    select.Where.And("_people_name", DB.Op.Like, "bob");
    DB.Results results = select.Query();

    // much better now.  Select is a sealed object.  The Database class has a bunch of
    // delegates that convert any type (including Select, Delete, int, decimal) to
    // appropriate SQL.  Much less work implementing different providers.
}
finally
{
    DatabasePool.Release();
}

立即

我现在有机会再次这样做(以及项目时间)。我想我的问题是,这是处理在对象中封装数据库操作的不同提供程序的好方法吗?代表们工作正常:

1)为ColumnSelectDeleteintNULL,etceteras编写生成器很容易,但在构造时{{1在条款中,我最终得到了一堆微小的原子对象,这些对象做了“部分”的事情。

2)虽然不同风格的SQL有细微差别,但大部分是相同的。基础数据库类为几乎所有对象提供了可接受的默认值,不同的提供者只是替换了这些委托。但我并不认为这对程序员来说非常“明确”。目前尚不清楚哪一层是由哪一层代码处理的。

有更好的方法吗?我对替换编写任何SQL的对象的概念感到高兴。通过清理和从数据库类型到.NET类型的适当类型转换,它们可以非常轻松地动态构建SQL语句(例如,我从不处理数据库对象之外的数据库类型。我总是得到一个DateTime返回,System.UInt32,bool等)。

1 个答案:

答案 0 :(得分:1)

你有没有玩过LINQ to SQL?它并不是一个功能齐全的ORM,但它确实代表了一种流畅的数据库操作表示模型。即使您不想使用LINQ to SQL,您也可以考虑编写自己的LINQ提供程序,这更符合您的口味。这样做的好处是,熟悉LINQ的开发人员可以使用您的系统而无需额外的学习曲线。如果您还不熟悉,请阅读Expression Trees。 LINQ的设计几乎完全符合您的描述,并且进行了大量工作,允许非常灵活和自然地表示查询。