簡體   English   中英

提取數據庫類/ API的適當方法?

[英]Appropriate way to abstract away a Database class/API?

根據政策,我必須使用MS Access,但是由於實體框架不支持它,因此我決定創建自己的類,該類將MS Access特定的代碼抽象化,如下所示:

public class DB
{

    public string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
    public string fileName = "db.mdb";
    public string connectionString;
    public OleDbConnection connection = null;

    public DB()
    {
        this.connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; " +
            "Data Source=" + this.path + "\\" + this.fileName;

        connection = new OleDbConnection(connectionString);
        connection.Open();
    }


    public OleDbDataReader Read(String queryString)
    {
        OleDbCommand cmd = new OleDbCommand(queryString, connection);
        return cmd.ExecuteReader();
    }

    ~DB()
    {
        if (connection != null)
        {
            connection.Close();
        }
    }
}

我有幾個問題:

  1. 這是提取數據庫的一種好方法,這樣我以后可以更輕松地替換它,或者有更合理的方法來這樣做嗎?
  2. 如何確保完成后數據庫連接始終關閉?
  3. 如果有多個具有打開連接的數據庫實例,是否有問題? 即您可以與MS Access數據庫建立多個連接(或者我應該在此處使用單例模式)嗎?

您的問題與“堆棧溢出”的“太寬泛”有關; 考慮根據您的實際可部署性測試每個更改。 也就是說,我可以提出一些一般性建議:

如果要“抽象” API,請使其與您要抽象的接口匹配。 例如,如果您以Entity Framework為目標,則使您的類返回DbSet<YourClass>而不是DbSet<YourClass>YourClass實例。 這應該使您無需更改代碼即可切換到EF。

使您的DB類(可怕的名稱;我建議您使用YourBusinessModel )繼承DbContext ,實現Dispose ,並使用類似以下的代碼:

using (var bm = new YourBusinessModel(yourDbConnection))
{
    bm.YourEntities.Load(predicate);
    foreach (var ye in bm.YourEntities)
        DoSomethingWith(ye.InterestingProperty);
}

除非您確實需要終結器,否則不要使用它們,而且我認為您不需要它們。

嘗試與Access數據庫建立多個連接確實很危險,除非它們都是只讀的。 如果您甚至有一個並行運行的編寫器,我建議序列化對數據庫的訪問。 如果這太難了,那么使其成為單例可能是一個不錯的第一個版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM