【ADO.NET】Microsoft.Practices.EnterpriseLibrary.Data 能减少哪些重复性工作

Microsoft.Practices.EnterpriseLibrary.Data 数据访问应用程序块旨在帮助开发者简化数据访问代码,减少重复性工作。它提供了许多便捷的方法和类来执行常见的数据库操作,比如打开连接、执行命令、处理参数等。下面通过几个具体的例子说明它可以如何减少重复性工作。

1. 管理数据库连接

在没有使用 Microsoft.Practices.EnterpriseLibrary.Data 的情况下,开发者需要手动管理数据库连接的打开和关闭,确保即使发生异常也能正确关闭连接。这通常涉及到 try-catch-finally 块的使用。

使用前:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(queryString, connection);
    try
    {
        connection.Open();
        // 执行查询或更新操作
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            // 处理结果集
        }
    }
    catch (Exception ex)
    {
        // 异常处理
    }
    finally
    {
        if (connection.State == ConnectionState.Open)
        {
            connection.Close();
        }
    }
}

使用后:

Database db = DatabaseFactory.CreateDatabase("MyConnectionString");
DbCommand cmd = db.GetSqlStringCommand(queryString);
using (IDataReader reader = db.ExecuteReader(cmd))
{
    while (reader.Read())
    {
        // 处理结果集
    }
}
// 连接管理由库自动处理

这里,Database 类会自动管理连接的生命周期,减少了手动编写连接管理代码的需求。 

2. 参数化查询

为了防止SQL注入攻击,所有用户输入的数据都应该使用参数化查询。使用原生ADO.NET时,设置参数可能会变得冗长且容易出错。

使用前:

SqlCommand command = new SqlCommand("SELECT * FROM Users WHERE UserId = @UserId", connection);
command.Parameters.AddWithValue("@UserId", userId);

使用后:

Database db = DatabaseFactory.CreateDatabase("MyConnectionString");
DbCommand cmd = db.GetStoredProcCommand("GetUserById");
db.AddInParameter(cmd, "UserId", DbType.Int32, userId);
IDataReader reader = db.ExecuteReader(cmd);

Microsoft.Practices.EnterpriseLibrary.Data 提供了更简洁的方式来添加参数,使得代码更加清晰易读。

3. 执行存储过程

执行存储过程时,除了要写SQL语句外,还需要处理参数、返回值等细节。Database 类提供了专门的方法来简化这一过程。

使用前:

SqlCommand command = new SqlCommand("UpdateUser", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@UserId", SqlDbType.Int)).Value = userId;
command.Parameters.Add(new SqlParameter("@UserName", SqlDbType.VarChar)).Value = userName;
try
{
    connection.Open();
    command.ExecuteNonQuery();
}
catch (Exception ex)
{
    // 异常处理
}
finally
{
    connection.Close();
}

使用后:

Database db = DatabaseFactory.CreateDatabase("MyConnectionString");
DbCommand cmd = db.GetStoredProcCommand("UpdateUser");
db.AddInParameter(cmd, "UserId", DbType.Int32, userId);
db.AddInParameter(cmd, "UserName", DbType.String, userName);
db.ExecuteNonQuery(cmd);
// 自动管理连接

在这里,GetStoredProcCommandExecuteNonQuery 方法大大简化了调用存储过程的过程。

4. 批量更新

虽然 Microsoft.Practices.EnterpriseLibrary.Data 不直接提供批量插入或更新的功能,但它可以通过简化事务管理和批处理逻辑来间接支持这些需求。

示例:在一个事务中执行多个更新操作

Database db = DatabaseFactory.CreateDatabase("MyConnectionString");
using (DbConnection connection = db.CreateConnection())
{
    connection.Open();
    using (DbTransaction transaction = connection.BeginTransaction())
    {
        try
        {
            DbCommand cmd1 = db.GetStoredProcCommand("UpdateUser1");
            db.ExecuteNonQuery(cmd1, transaction);

            DbCommand cmd2 = db.GetStoredProcCommand("UpdateUser2");
            db.ExecuteNonQuery(cmd2, transaction);

            transaction.Commit();
        }
        catch (Exception ex)
        {
            transaction.Rollback();
            throw;
        }
    }
}

这个例子展示了如何利用 Microsoft.Practices.EnterpriseLibrary.Data 来简化事务管理,确保一系列数据库操作要么全部成功提交,要么全部回滚。

 

通过以上示例可以看出,Microsoft.Practices.EnterpriseLibrary.Data 可以显著减少与数据库交互相关的重复性代码,提高代码的可维护性和可靠性。不过需要注意的是,尽管它提供了很多便利,但在现代开发实践中,ORM(如 Entity Framework 或 Dapper)因其更高的抽象层次和更强的功能特性而更为流行。根据具体项目需求选择合适的技术是非常重要的。

 

posted @ 2025-06-12 14:29  Doc.stu  阅读(32)  评论(0)    收藏  举报