多层体系结构中的通用数据访问层

时间:2011-08-18 13:03:52

标签: c# data-access-layer

我需要创建一个通用数据访问层,用于我在软件工程中的最终作业,但我当前创建的数据访问层可以自动生成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
    }
}

3 个答案:

答案 0 :(得分:1)

这可能无法完全回答您的问题,但您可以通过多种方式改进此代码。

构成与继承

首先,了解并应用组合而不是继承。构成是“有”关系,而继承是“是一种”关系。

例如,如果Person类具有Phone类类型的属性,则它的组成。

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

如果Person类来自Phone类,那么它是继承。

public class Person : Phone
{
}

在你的代码中,sqlFactory应该包含一个sqlConn而不是从它继承。

组合提供了更大的灵活性,尤其是因为C#不允许多重继承。请阅读此处了解更多信息:Prefer composition over inheritance?

SQL注入

你永远不应该像这样使用字符串连接来构建sql语句。

"SELECT * FROM " + dbData[0]

这会产生一个潜在的安全漏洞,允许SQL注入攻击。您应该始终使用参数化查询来防止这种情况。

阅读Tip/Trick: Guard Against SQL Injection Attacks以了解SQL注入攻击以及如何防止它们。

编码惯例

C#开发人员几乎普遍接受的类命名约定是使用PascalCase,其中类名中每个单词的首字母大写。您的类将是SqlFactory,SqlConn和DbDefinition。

本指南提供了相当常用的约定:C# Coding Standards document

答案 1 :(得分:1)

您的DAO应该有作为表格模型的支持类。这些模型都应该有一个共同的界面。然后,您的DAO应该具有Model接口的实例,其XML配置指向模型的正确表。这将使您无需在代码中定义表。您的数据访问层是访问数据的层,而不是定义数据的层。您的模型应该定义数据。

答案 2 :(得分:0)

尝试在xml文件中定义数据库架构信息并读取它以创建CRUD操作。