0

我目前正在開發一個查詢生成器應用程序,基本上是一個簡單的圖形界面,應該允許用戶不知道SQL來定義數據庫上的各種查詢(連接,選擇,更新,插入,刪除)。我將使用.Net 3.5。我的應用程序應該支持多個數據庫,它應該可以和MS-SQL Server,MySQL和Oracle一起工作,所以我會很感激任何關於相關講座的提示或鏈接,如何設計一個獨立於提供程序的DAL如何設計一個提供者獨立DAL(.Net)

用戶將選擇數據庫服務器,當前服務器上的數據庫,提供連接憑證,選擇各種表格,定義查詢(使用一系列組合框),並最終在查詢有效時執行查詢。當然,在DAL中,我確實希望爲每個DB提供者提供方法。我正在考慮工廠模式的問題。

注意:這是一個簡單的學校項目,所以我對安全性或結果查詢的性能不感興趣。

更新:經過一些更多的研究和您提供的非常有價值的輸入,我決定使用DbProviderFactory。 ORM會很有趣,但是因爲我只想要一個查詢分析器/構建器,所以我沒有看到使用它的一點。所以,如果你能指出我有關如何使用DbProviderFactory和相關類的詳細教程,我將不勝感激。

回答

2

我推薦使用System.Data.Common.DbProviderFactories類來生成通用的ADO.NET類。

當您想要支持的數據庫找到更多的.NET提供程序時,只需將提供程序DLL放入應用程序的路徑中,然後在app.config文件中添加對提供程序的DbProviderFactory的引用即可。您可以讓用戶選擇要使用的提供程序。

這裏是關於主題的MSDN文章:Obtaining a DbProviderFactory (ADO.NET)

我用這個方法前,已經能夠支持MSSQL和SQLite與少量的配置變化在同一個項目。

不知道是否會爲一個查詢生成器應用程序的工作,雖然還有...

0

我認爲ADO.NET實體框架(從.NET 3.5 SP1開始可用)是一個很好的選擇,因爲它幾乎將實體SQL語言抽象爲與數據庫相關的SQL。

+0

截止目前,ADO.NET EF僅支持Microsofts的DBMS。 – 2009-04-21 13:10:30

+0

實體僅適用於MS SQL Server。 – kjv 2009-04-21 13:11:45

0

你可能會驚訝,但一個很簡單的供應商獨立DAL可以實現:

老式的DataSet的DataTable

0

我必須說,編輯一個合理複雜的查詢視覺上是繁瑣。並允許用戶使用視覺設計師插入/刪除數據是一種在腳下拍攝自己的特定方式。一個縮小版的Management Studio,基本的SQL和受限制的服務器用戶的知識將會做得更好。

如果你仍然傾向於設計這個應用程序,你需要NHibernate。更確切地說,Criteria Queries將完成這項工作,因爲它們映射得非常接近你所需要的。

0

大多數ORM(對象關係映射)都知道如何與各種數據庫類型進行交談。

至於允許用戶建立自己的查詢:你需要非常小心。用戶可能會創建惡意查詢(儘管這可能是一個問題),因爲這是偶然事件。編寫一個查詢將使用所有可用的服務器資源併爲您的數據庫創建一個有效的拒絕服務,這非常容易。

0

我不知道,如果這有助於你的追求,但有一點我最近才知道,而並走上心臟是讓數據模型的唯一標識符實現不會直接傳播到數據層之外,而是被包裝在抽象中。舉例來說,這裏是封裝了一個模型的標識符的接口:在你的數據庫表

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); 
} 

你的業務邏輯層,這可能對周圍int S作爲唯一標識符傳遞(例如在過去,從標識列),現在通過這樣:然後

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

你的數據層將具有它實現IModelIdentifier<Person>並填充與物理模型的唯一標識符其內部數據類型的類。這將業務層與數據層可能發生的任何更改隔離開來,例如用Guid s替換int密鑰標識符。