65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Microsoft Enterprise Library 数据访问应用程序块 – 第 II 部分

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.07/5 (16投票s)

2009年8月5日

CPOL

3分钟阅读

viewsIcon

92769

downloadIcon

1312

使用 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 类,用于从数据库获取用户信息,并将用户实体对象或用户实体对象的通用列表返回给调用者。

  • EventLog.cs:框架/实用程序层类。此类用于将错误信息记录到系统的应用程序事件日志中。有关使用 Microsoft 企业库日志记录应用程序块的事件日志记录机制的详细信息,请参阅我的文章使用 Microsoft 企业库日志记录应用程序块
  • SQLScripts.sql:用于创建数据库表和示例中使用的存储过程的 SQL 脚本。

结论

到目前为止,您可以了解使用 Enterprise Library 4.1 应用程序块进行数据访问以从数据库检索数据是多么简单。要了解有关 Microsoft Enterprise Library 4.1 应用程序块的更多信息,请参阅 URL http://msdn.microsoft.com/en-us/library/dd203099.aspx

© . All rights reserved.