使用 Microsoft Enterprise Library 数据访问应用程序块 – 第 II 部分
使用 Microsoft 企业库数据访问应用程序块从数据库检索数据。
引言
在我之前的文章使用 Microsoft 企业库数据访问应用程序块 – 第一部分中,我展示了如何使用数据访问应用程序块,按照分层架构,通过存储过程来插入和更新数据库中的数据。在本文中,让我展示如何使用数据访问块来检索数据。
请注意,我使用的是 Microsoft 企业库 4.1 – 2008 年 10 月发布的版本。它适用于 .NET framework 3.5 和 Visual Studio 2008。
您可以从以下 URL 下载 Microsoft 企业库 4.1:http://www.microsoft.com/downloads/details.aspx?FamilyId=1643758B-2986-47F7-B529-3E41584B6CE5&displaylang=en。
集成和使用
- 代码:在附加的源代码中,我加入了数据访问层类、实体类、
EventLog
类以及创建表和相关存储过程的 SQL 脚本。还有来自数据访问应用程序块的相关程序集。该代码用于从数据库获取用户信息(基于 UserID 的用户详细信息和所有活动用户)。我将这些类放在同一个文件夹中,但它们位于不同的命名空间和程序集中。更好的做法是将不同的层放在不同的命名空间和不同的程序集中。 - 解释:首先,我们需要安装 Microsoft 企业库 4.1,并获取程序集“Microsoft.Practices.EnterpriseLibrary.Common.dll”和“Microsoft.Practices.EnterpriseLibrary.Data.dll”,并将它们添加到项目中的引用中。在附加的示例中,如果您不想下载和安装 Microsoft 企业库 4.1,您会找到必要的 DLL。
- User.cs:实体层类。此类用于在各个层之间传递用户数据。
- UserDAC.cs:数据访问层类。此类具有按 ID 获取用户详细信息和获取所有活动用户的方法。这些方法执行相关过程以获取用户信息。应该从业务层类调用此类以从数据库获取数据。业务层将调用数据层类的相关方法,然后返回用户实体对象(用于用户详细信息)和所有活动用户的通用列表。
请注意,此类继承了 DataAccessComponent
类。DataAccessComponent
具有从过程中返回的结果集中以通用方式获取数据的方法。UserDAC
类的 ParseUser
方法用于通过迭代 DataReader
来填充 User
实体对象。GetUserDetailsById
返回 User
实体对象以及消息 ID 和消息字符串。如果传递给此方法的用户 ID 不存在用户,则消息 ID 将返回一个负整数,消息字符串将返回一个错误字符串。为了演示目的,我使其保持简单;但是,可以根据应用程序需求和架构进行配置。
User
数据访问类还将使用 EventLog
类将错误记录在应用程序事件日志中。
public User GetUserDetailsById(int vintUserId,
out int vintMessageId, out string vstrMessage)
{
Database objDB = new SqlDatabase(ConnectionString);
using (DbCommand objCMD =
objDB.GetStoredProcCommand("sprocSample_GetUserDetails"))
{
objDB.AddInParameter(objCMD, "@intUserID", DbType.Int32, vintUserId);
objDB.AddOutParameter(objCMD, "@intErrID",
DbType.Int32, Int32.MaxValue);
objDB.AddOutParameter(objCMD, "@strMessage", DbType.String, 255);
User objUser = null;
try{
using (IDataReader objDataReader = objDB.ExecuteReader(objCMD))
{
if (objDataReader.Read())
{
objUser = ParseUser(objDataReader);
vintMessageId = vintUserId;
vstrMessage = null;
}
else
{
vintMessageId = Convert.ToInt32(objDB.GetParameterValue(objCMD,
"@intErrID"));
vstrMessage = objDB.GetParameterValue(objCMD,
"@strMessage").ToString();
}
}
}
catch (Exception ex)
{
EventLog objLog = new EventLog();
objLog.LogError(ex);
throw ex;
}
return objUser;
}
}
public List<user> GetAllActiveUsers()
{
Database objDB = new SqlDatabase(ConnectionString);
using (DbCommand objCMD =
objDB.GetStoredProcCommand("sprocSample_GetActiveUsers"))
{
List<user> objUserList = new List<user>();
try{
using (IDataReader objDataReader = objDB.ExecuteReader(objCMD))
{
while (objDataReader.Read())
{
User objUser = ParseUser(objDataReader);
objUserList.Add(objUser);
}
}
}
catch (Exception ex)
{
EventLog objLog = new EventLog();
objLog.LogError(ex);
throw ex;
}
return objUserList;
}
}
private User ParseUser(IDataReader vobjDataReader)
{
User objUser = new User();
objUser.UserID = base.GetDataValue<int>(vobjDataReader, "UserID");
objUser.UserName = base.GetDataValue<string>(vobjDataReader, "UserName");
objUser.FirstName = base.GetDataValue<string>(vobjDataReader, "FirstName");
objUser.LastName = base.GetDataValue<string>(vobjDataReader, "LastName");
objUser.UserPassword = base.GetDataValue<string>(vobjDataReader, "UserPassword");
return objUser;
}
以上方法来自 UserDAC
类,用于从数据库获取用户信息,并将用户实体对象或用户实体对象的通用列表返回给调用者。
结论
到目前为止,您可以了解使用 Enterprise Library 4.1 应用程序块进行数据访问以从数据库检索数据是多么简单。要了解有关 Microsoft Enterprise Library 4.1 应用程序块的更多信息,请参阅 URL http://msdn.microsoft.com/en-us/library/dd203099.aspx。