在.NET平台操作SQL Server数据库时,SqlDataReader和数据适配器SqlDataAdapter是最常用的两个数据访问组件,两者的工作模式和使用场景存在明显差异,开发者需要根据实际需求选择使用。

SqlDataReader的核心特性与使用
SqlDataReader是在线只读向前的数据读取器,它需要和数据库保持活动连接,读取数据时数据库连接在占用状态,读取完成后需要手动关闭连接。
适用场景
- 只需要读取数据,不需要修改数据
- 数据量较大,不需要把所有数据一次性加载到内存中
- 对数据读取性能要求较高的场景
使用示例
以下是使用SqlDataReader读取用户表数据的完整示例:
using System;
using System.Data;
using System.Data.SqlClient;
class Program
{
static void Main()
{
// 数据库连接字符串,实际开发中建议放在配置文件中
string connStr = "Server=127.0.0.1;Database=TestDB;User Id=sa;Password=123456;";
// 查询SQL语句
string sql = "SELECT Id, UserName, Age FROM UserInfo";
// 创建数据库连接对象
using (SqlConnection conn = new SqlConnection(connStr))
{
// 创建命令对象
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
// 打开数据库连接
conn.Open();
// 执行命令获取SqlDataReader对象
using (SqlDataReader reader = cmd.ExecuteReader())
{
// 循环读取每一行数据
while (reader.Read())
{
// 通过索引或者列名获取数据
int id = reader.GetInt32(0);
string userName = reader.GetString(1);
int age = reader.GetInt32(2);
Console.WriteLine($"Id:{id}, 用户名:{userName}, 年龄:{age}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"读取数据出错:{ex.Message}");
}
// using语句结束会自动关闭连接
}
}
}
SqlDataAdapter的核心特性与使用
SqlDataAdapter是离线数据适配组件,它不需要一直保持数据库连接,会将查询结果填充到本地的DataSet或者DataTable中,后续对数据的操作都在本地内存完成,最后可以通过适配器把修改同步回数据库。
适用场景
- 需要对数据进行修改、删除、新增等操作
- 需要把数据绑定到界面控件(如WinForm、ASP.NET的GridView等)
- 需要断开数据库连接后继续使用数据的场景
使用示例
以下是使用SqlDataAdapter查询数据并填充到DataTable的示例:
using System;
using System.Data;
using System.Data.SqlClient;
class Program
{
static void Main()
{
string connStr = "Server=127.0.0.1;Database=TestDB;User Id=sa;Password=123456;";
string sql = "SELECT Id, UserName, Age FROM UserInfo";
// 创建数据适配器对象
SqlDataAdapter adapter = new SqlDataAdapter(sql, connStr);
// 创建DataTable存储数据
DataTable dt = new DataTable();
try
{
// 填充数据到DataTable,适配器会自动打开和关闭连接
adapter.Fill(dt);
// 遍历DataTable中的数据
foreach (DataRow row in dt.Rows)
{
int id = Convert.ToInt32(row["Id"]);
string userName = row["UserName"].ToString();
int age = Convert.ToInt32(row["Age"]);
Console.WriteLine($"Id:{id}, 用户名:{userName}, 年龄:{age}");
}
// 修改本地数据的示例
if (dt.Rows.Count > 0)
{
dt.Rows[0]["Age"] = 25;
}
// 创建命令构建器,自动生成更新命令
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
// 将本地修改同步回数据库
adapter.Update(dt);
Console.WriteLine("数据更新完成");
}
catch (Exception ex)
{
Console.WriteLine($"操作数据出错:{ex.Message}");
}
}
}
两者的核心差异对比
通过以下表格可以清晰看到两者的区别:
| 对比维度 | SqlDataReader | SqlDataAdapter |
|---|---|---|
| 连接模式 | 在线,读取时连接必须保持打开 | 离线,填充数据后自动关闭连接 |
| 数据操作权限 | 只读,只能向前遍历 | 可读写,支持增删改查 |
| 内存占用 | 低,逐行读取不缓存全部数据 | 高,会把全部数据加载到内存 |
| 适用数据量 | 适合大数据量读取 | 适合小数据量操作 |
| 数据绑定支持 | 不支持直接绑定界面控件 | 支持直接绑定界面控件 |
选型建议
在实际开发中可以按照以下原则选择:
- 如果只需要读取大量数据做展示或者后续处理,不需要修改数据,优先选择SqlDataReader,性能更好且内存占用低。
- 如果需要对数据进行修改,或者需要把数据绑定到前端界面,优先选择SqlDataAdapter,操作更便捷。
- 如果读取的数据量很小,两者都可以使用,根据团队习惯选择即可。
注意:使用SqlDataReader时,一定要确保读取完成后关闭连接,推荐使用using语句自动管理资源,避免出现连接泄漏的问题。
SqlDataReaderSqlDataAdapterADO.NET数据库连接修改时间:2026-06-27 10:12:29