【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); // 自动管理连接
在这里,GetStoredProcCommand 和 ExecuteNonQuery 方法大大简化了调用存储过程的过程。
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)因其更高的抽象层次和更强的功能特性而更为流行。根据具体项目需求选择合适的技术是非常重要的。

浙公网安备 33010602011771号