在 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 :)
总的来说,我对 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 :)