我目前正在开发一个查询构建器应用程序,基本上,一个简单的图形界面,应该允许用户没有SQL的知识数据库(联接,SELECT,INSERT,UPDATE,DELETE)上定义各种查询。我将使用.NET 3.5。我的应用程序应该支持多种数据库,它应该与MS-SQL服务器,MySQL和Oracle工作,所以我将不胜感激任何提示或链接到相关的讲座如何设计一个独立于提供DAL

用户将选择一个数据库服务器,当前服务器上的数据库,提供所述连接凭据,选择各种表,定义查询(使用一系列的组合框),最后执行查询,如果它们是有效的。当然,在DAL我确实想为每个DB提供方法。我想在工厂模式的线的东西。

请注意:这是一个简单的学校项目,所以我不感兴趣,导致查询的安全性和性能。

更新:经过一些调查研究,并与您所提供的非常有价值的投入,我决定使用DbProviderFactory。 ORM将是有趣的,但因为我只想要一个查询分析器/建设者,我没有看到使用一个点。所以,我将不胜感激,如果你会点我如何使用DbProviderFactory和相关的类一个详细的教程。

有帮助吗?

解决方案

我建议使用System.Data.Common.DbProviderFactories类来生成通用ADO.NET类。

当你找到你想要支持的数据库的详细.NET提供,简单地丢弃在应用程序的路径提供者DLL并添加引用在DbProviderFactory文件中提供的app.config。您可以让用户选择要使用的供应商。

下面是关于该主题的MSDN文章称为获得一个DbProviderFactory(ADO。 NET)

我用之前这种做法,已经能够支持在同一项目MSSQL和SQLite与未成年人的配置变化。

不知道,如果它会为一个查询生成器应用程序以及工作虽然...

其他提示

我必须说,可视化编辑了一个相当复杂查询的非常的繁琐。并允许用户插入/删除使用可视化设计数据是搬起石头砸自己的脚一定的方式。 Management Studio中的大小下来的版本,基本的SQL加限制服务器用户的知识会做一个更好的工作。

如果你仍然倾向于设计这个程序,你需要NHibernate的。更确切地说,条件查询将做的工作,因为他们很地图靠近你所需要的。

您可能会感到惊讶,而是一个非常简单的供应商无关DAL可以实现普通的老式 DataSet DataTable

我想ADO.NET实体框架(可用自.NET 3.5 SP1)是一个伟大的选择,因为与它的实体SQL语言也非常抽象掉依赖于数据库的SQL。

多数任何ORM(对象关系映射器)会知道如何与各种数据库类型。

至于允许用户建立自己的疑问:你必须非常小心这一点。这不是这么多,用户可以创建恶意的查询(尽管这可能是一个问题),因为它是意外。这是非常容易编写将使用所有可用的服务器资源,创造业务的有效拒绝为您的数据库查询。

我不知道这是否与你的追求助攻,但有一点我最近才知道,而并走上心脏是有你的数据模型的唯一标识符的实施没有直接的数据层的外面传播,而是被包裹在一个抽象。例如,这里是它封装一个模型的标识符的接口:

public interface IModelIdentifier<T> where T : class 
{
    /// <summary>
    /// A string representation of the domain the model originated from.
    /// </summary>
    string Origin { get; }

    /// <summary>
    /// The model instance identifier for the model object that this 
    /// <see cref="IModelIdentifier{T}"/> refers to.  Typically, this 
    /// is a database key, file name, or some other unique identifier.
    /// <typeparam name="KeyDataType">The expected data type of the 
    /// identifier.</typeparam>
    /// </summary>
    KeyDataType GetKey<KeyDataType>();

    /// <summary>
    /// Performs an equality check on the two model identifiers and 
    /// returns <c>true</c> if they are equal; otherwise <c>false</c> 
    /// is returned.  All implementations must also override the equal operator.
    /// </summary>
    /// <param name="obj">The identifier to compare against.</param>
    /// <returns><c>true</c> if the identifiers are equal; otherwise 
    /// <c>false</c> is returned.</returns>
    bool Equals(IModelIdentifier<T> obj);
}

您商业逻辑层,其可以具有在(在数据库中的表,例如,从标识列)周围ints作为唯一标识符传递过去,现在,作为这样的传递:

    public IPerson RetrievePerson(IModelIdentifier<IPerson> personId)
    {
        /// Retrieval logic here...
    }

您数据层将然后让其实现IModelIdentifier<Person>并填充与物理模型的唯一标识符其内部数据类型的类。这从您可能需要在数据层的任何变化,如用ints更换您Guid密钥标识符隔离业务层。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top