ADO.NET 是 .NET Framework 中用于访问和管理数据的重要组件。它提供了一套强大的类库,让开发者能够轻松连接数据库、执行查询和操作数据。从入门开始,你只需要引入 System.Data 和 System.Data.SqlClient 命名空间,然后使用 SqlConnection、SqlCommand 和 SqlDataReader 等核心类,就能快速上手。以下是一个简单的入门代码示例:using System; using System.Data.SqlClient; class Program { static void Main() { string connStr = "Server=localhost;Database=TestDB;Integrated Security=true;"; using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM Users", conn); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Console.WriteLine(reader["Name"]); } } } } 这段代码展示了连接数据库、执行查询并读取结果的基本流程。通过掌握这些,你将开启高效开发之旅。
ADO.NET 基础概念
ADO.NET 主要由四个核心对象组成:Connection(连接)、Command(命令)、DataReader(只前进读取器)和DataAdapter(数据适配器)。Connection 用于建立与数据库的连接,比如 SqlConnection 用于 SQL Server。Command 对象封装了 SQL 语句或存储过程,可以执行查询或更新操作。DataReader 提供快速、向前只读访问数据的最佳方式,而 DataAdapter 则用于将数据填充到内存中的 DataSet 中,实现断开连接的访问模式。这些组件共同构成了数据交互的艺术。
连接数据库和执行查询
首先,创建连接字符串,例如:"Data Source=server;Initial Catalog=database;User ID=user;Password=pass;"。然后实例化 SqlConnection 对象,并调用 Open() 方法打开连接。接下来,创建 SqlCommand 对象,设置 CommandText 属性为 SQL 查询语句,最后调用 ExecuteReader() 执行并获取 DataReader。通过 while (reader.Read()) 循环遍历数据,每行调用 reader.GetString("column") 或 reader["column"] 获取值。记得在使用完毕后调用 reader.Close() 和 conn.Close() 释放资源。
使用 DataSet 和 DataAdapter
DataSet 是一个内存中的数据缓存,可以存储多个表和关系。DataAdapter 充当桥梁,它有 SelectCommand、InsertCommand 等属性。通过 adapter.Fill(dataSet) 方法,从数据库填充数据到 DataSet。随后,你可以像操作本地数据一样修改 DataSet 中的数据,最后调用 adapter.Update(dataSet) 将更改同步回数据库。这种方式特别适合离线场景,避免频繁连接数据库。
参数化查询和事务处理
为了防止 SQL 注入,必须使用参数化查询。例如:SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Id = @id", conn); cmd.Parameters.AddWithValue("@id", 1); 这比字符串拼接安全得多。对于事务,使用 SqlTransaction trans = conn.BeginTransaction(); cmd.Transaction = trans; 执行多个命令后,trans.Commit() 提交或 trans.Rollback() 回滚,确保数据一致性。
高级主题:异步操作和批量处理
ADO.NET 支持异步方法,如 conn.OpenAsync() 和 cmd.ExecuteReaderAsync(),适用于 UI 应用避免阻塞线程。批量插入可以使用 SqlBulkCopy 类:using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)) { bulkCopy.DestinationTableName = "Users"; bulkCopy.WriteToServer(dataTable); } 这能显著提升大数据插入性能。
性能优化技巧
使用连接池(默认启用)、及时关闭资源、选择合适的隔离级别,以及使用 DataReader 而非 DataSet 当只需读取时,都能优化性能。监控连接字符串中的 Pooling=true 和 Max Pool Size 参数。
FAQ
Q: ADO.NET 和 Entity Framework 有什么区别?
A: ADO.NET 是低级 API,直接操作 SQL,灵活但代码多;Entity Framework 是 ORM,自动生成 SQL,开发更快。
Q: 如何处理连接超时?
A: 在连接字符串中添加 Connection Timeout=30; 或使用 CommandTimeout 属性。
Q: DataReader 和 DataAdapter 哪个更快?
A: DataReader 更快,因为它是流式读取,不加载整个数据集到内存。
Q: 支持哪些数据库?
A: 通过不同提供程序,如 SqlClient for SQL Server、OleDb for Access、OracleClient for Oracle 等。