在 ADO.NET 中编写更少的代码(包装器 类)

Writing less code in ADO.NET (wrapper classes)

总的来说,我对 C# 还很陌生,但目前我对该语言有基本的了解。

当访问 SQL 数据库时,我决定使用 ADO.NET(SqlClient 似乎是最好的方法,我已经设法让它工作,包括使用查询. 我的问题是,一旦我开始更频繁地查询数据库,我似乎只是一遍又一遍地重写非常相似的代码(这显然是不好的做法)。 很明显,我需要制作某种 class 来处理我对 ADO.NET (SqlClient) 的使用,这样我就不能只输入如下内容:

DatabaseConnection.Query("SELECT * FROM tblProducts");

...而不是...

using (SqlConnection cnn = new SqlConnection(cnnString)) // cnnString was defined earlier in the code
{
    SqlCommand cmd = new SqlCommand("SELECT ProductType FROM tblProductTypes", cnn);
    DataTable dt = new DataTable();
    cnn.Open();
    dt.Load(cmd.ExecuteReader());
    cboFilterTypes.DataSource = dt;
    cboFilterTypes.DisplayMember = "ProductType";
    cboFilterTypes.ValueMember = "ProductType";
    cnn.Close();
}

所以我想我需要制作一个 class 包装器(至少我相信它是这样叫的),但我不太确定如何去做。有没有人有任何建议或技巧可供我使用?

明确地说,我不想使用 entity framework 或任何基于 ADO.NET 的类似东西 - 我已经尝试 entity framework并认为缺点太多。

坚持您对 'wrapper' 的请求,您可以简单地创建一个静态辅助方法来处理对数据库的调用,例如

    public static DataTable GetDataTable(string query)
    {
        DataTable result = new DataTable();
    using (SqlConnection cnn = new SqlConnection(cnnString)) // cnnString was defined earlier in the code
    {
            SqlCommand cmd = new SqlCommand(query, cnn);
            result = new DataTable();
            cnn.Open();
            result.Load(cmd.ExecuteReader());
            cnn.Close();
     }
return result;
    }

你可以这样称呼它

    cboFilterTypes.DataSource = GetDataTable("SELECT ProductType FROM tblProductTypes")
    cboFilterTypes.DisplayMember = "ProductType";
    cboFilterTypes.ValueMember = "ProductType";

除了小型项目,我不会推荐这种数据访问方式。如果您真的不喜欢 EF,那么 Dapper 或类似的东西会提供更具可扩展性的解决方案。 Whosebug 本身使用 Dapper :)