【发布时间】:2023-03-21 14:35:02
【问题描述】:
我是数据库/SQL/ADO.NET 新手,在尝试学习 NHibernate 或 Entity Framework 等 ORM 框架之前,我正在努力打下坚实的基础。我一直在阅读与平台无关的 RDBMS 概念,现在我正在尝试将其调整为编写与数据库实际交互的干净且可重用的 C# 代码。我听说过 Martin Fowler 的 Patterns of Enterprise Application Architecture 和 has been recommended here before,但标题中的“企业”让我想知道在我准备好阅读那本书之前是否需要进行一些中间学习步骤。
作为实践,我正在制作一个简单的 ASP.NET 网站,帮助访问者从包含数千条记录的数据库中查找某些信息。这是一个非常简单的第一个项目——没有任何类型的用户帐户或登录,该网站每天会获得大约十几个点击量。
我的 ASP.NET 代码提供了一些类似这样的方法来从数据库中检索数据:
string dbConnectString = "...";
public List<string> GetItems()
{
List<string> rList = null;
using (SqlConnection myConn = new SqlConnection(dbConnectString))
{
string queryStatement = "SELECT Name FROM SomeTable";
using (SqlCommand myCmd = new SqlCommand(queryStatement, myConn))
{
DataTable resultTable = new DataTable("Results");
using (SqlDataAdapter myAdapter = new SqlDataAdapter(myCmd))
{
myConn.Open();
if (myAdapter.Fill(resultTable) > 0)
{
// This loop should probably be a LINQ expression
rList = new List<string>();
foreach (DataRow row in resultTable.Rows)
{
rList.Add((string)row["Name"]);
}
}
myConn.Close();
}
}
}
return rList;
}
我认为就处理实现 IDisposable 的对象而言,我做了正确的事情。但是有没有更好的方法来编写方法本身?
以下是我的一些问题:
-
根据我的阅读,似乎连接池makes it OK to instantiate a new SqlConnection 每次调用GetItems() 之类的方法。有没有一种“更干净”的方式来编写代码,所以我仍然会进行适当的资源管理,但不会像
using (SqlConnection ...)这样的块有太多重复?这种方法怎么样:public class DatabaseManager : IDisposable { protected SqlConnection myConn; public DatabaseManager(string connectionString) { // Set up the constructor myConn = new SqlConnection(dbConnectString); } // IDisposable implementation stuff goes here. Any usage of // DatabaseManager would have to take place in a using() block. public List<string> GetItems() { List<string> rList = null; string queryStatement = "SELECT Name FROM dbo.SomeTable"; using (SqlCommand myCmd = new SqlCommand(queryStatement, myConn)) { DataTable resultTable = new DataTable("Results"); using (SqlDataAdapter myAdapter = new SqlDataAdapter(myCmd)) { myConn.Open(); if (myAdapter.Fill(resultTable) > 0) { rList = new List<string>(); foreach (DataRow row in resultTable.Rows) { rList.Add((string)row["Name"]); } } myConn.Close(); } } return rList; } } 除了我无耻地使用垂直间距之外,还有更优雅的方法可以从数据库查询的结果中提取列表吗?一种方法是用 LINQ 调用替换 foreach() 迭代,但这只会节省两三行代码。
谢谢大家!
【问题讨论】: