簡體   English   中英

多層Arcitechture中的通用數據訪問層

[英]Generic Data Access Layer in an Multi-Layer Arcitechture

我需要創建一個通用數據訪問層,以便在我最終的軟件工程任務中使用,但我當前創建的數據訪問層可以自動生成CRUD(創建,讀取,更新和刪除)SQL語句。 我仍然需要在我的數據庫中定義每個表,每次更改數據庫時,我都需要在數據訪問層中定義更改。

請查看我的代碼示例,並告訴我如何更改我的代碼以改進我的訪問層:

class sqlConn
{
    //Local
    private String strConn = @"Data Source=.\SQLEXPRESS;" +
        @"AttachDbFilename='D:\JP Stuff\BELGIUM CAMPUS\3de Jaar\SOFTWARE ENGINEERING\ASSIGNMENT\Premier Service Solutions\Premier Service Solutions\DB\db_PSS_1.0.mdf';" +
        @"Integrated Security=True;" +
        @"User Instance=True";
    private SqlConnection conn;

    //Properties
    public SqlConnection Conn
    {
        get { return this.conn = new SqlConnection(this.strConn); }
    }

    //Constructor
    public sqlConn()
    {

    }
}




class sqlFactory : sqlConn
{
    //Constructor
    public sqlFactory()
        : base()
    {

    }

    //Insert Record into database
    public void Create(String[] dbData, List<String> strRow)
    {
        using (SqlConnection sqlCon = this.Conn)
        using (SqlCommand com = new SqlCommand("SELECT * FROM " + dbData[0], sqlCon))
        {
            SqlDataAdapter da = new SqlDataAdapter(com);
            SqlCommandBuilder sqlbuilder = new SqlCommandBuilder(da);

            DataSet ds = new DataSet();
            da.Fill(ds, dbData[0]);

            DataRow dr = ds.Tables[dbData[0]].NewRow();

            for (int i = 0; i < dbData.Count() - 2; i++)
            {
                dr[i + 1] = strRow[i];
            }

            ds.Tables[dbData[0]].Rows.Add(dr);
            da.Update(ds, dbData[0]);
        }
    }
}

 class dbDefinitions : sqlFactory
 {
    public static Dictionary<String, String[]> columns;

    static dbDefinitions()
    {
        columns = new Dictionary<String,String[]>();

        //tblCall Definition
        #region call
        String[] data = new String[]
        { 
            "tblCall", "call_ID_PK", "call_emp_ID_FK", 
            "call_Description", "call_Notes", "call_Start_Time", 
            "call_End_Time", "call_Job_FK"
        };
        columns.Add("call", data);
        #endregion
    }
}

這可能無法完全回答您的問題,但您可以通過多種方式改進此代碼。

構成與繼承

首先,理解並應用組合而不是繼承。 構成是“有”關系,而繼承是“是一種”關系。

例如,如果Person類具有Phone類類型的屬性,則它的組成。

public class Person 
{
    public Phone Phone {get; set;}
}

如果Person類是從Phone類繼承的,那么它是繼承。

public class Person : Phone
{
}

在你的代碼中,sqlFactory應該包含一個sqlConn而不是從它繼承。

組合提供了更大的靈活性,特別是因為C#不允許多重繼承。 在這里閱讀更多:更喜歡繼承的組合?

SQL注入

你永遠不應該像這樣使用字符串連接來構建sql語句。

"SELECT * FROM " + dbData[0]

這會產生一個潛在的安全漏洞,允許SQL注入攻擊。 您應該始終使用參數化查詢來防止這種情況。

閱讀提示/技巧:防范SQL注入攻擊以了解SQL注入攻擊以及如何防止它們。

編碼公約

C#開發人員幾乎普遍接受的類命名約定是使用PascalCase,其中類名中每個單詞的首字母大寫。 您的類將是SqlFactory,SqlConn和DbDefinition。

本指南提供了相當常用的約定: C#編碼標准文檔

您的DAO應該具有作為表的模型的支持類。 這些模型都應該有一個共同的界面。 然后,您的DAO應該具有Model接口的實例,其XML配置指向模型的正確表。 這將使您無需在代碼中定義表。 您的數據訪問層是訪問數據的層,而不是定義數據的層。 您的模型應該定義數據。

嘗試在xml文件中定義數據庫模式信息並讀取它以創建CRUD操作。

暫無
暫無

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

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