跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 数据读取器
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#数据读取器 = '''C#数据读取器'''(DataReader)是.NET框架中用于高效读取数据库数据的核心组件,属于`System.Data`命名空间下的轻量级只进流式读取器。它专为高性能数据访问设计,适用于需要快速遍历大量数据的场景。 == 核心特性 == * '''只进只读''':单向遍历结果集,不支持修改数据或反向移动 * '''连接依赖''':需保持数据库连接打开状态 * '''低内存消耗''':不缓存整个结果集,逐行处理 * '''高性能''':比DataSet/DataTable更高效处理大数据量 == 基础实现 == 主要使用`IDataReader`接口及其实现类(如`SqlDataReader`、`OleDbDataReader`等): <syntaxhighlight lang="csharp"> using System.Data.SqlClient; // 基本使用模式 string connectionString = "Server=.;Database=Northwind;Integrated Security=True;"; using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand("SELECT ProductID, ProductName FROM Products", connection); connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) // 逐行前进 { int id = reader.GetInt32(0); // 按索引获取 string name = reader.GetString(1); // 或 reader["ProductName"].ToString() Console.WriteLine($"{id}: {name}"); } } } </syntaxhighlight> === 输出示例 === <pre> 1: Chai 2: Chang 3: Aniseed Syrup ... </pre> == 关键技术点 == === 数据类型处理 === 数据读取器提供类型安全的方法: {| class="wikitable" |+ 常用Get方法 ! 方法 !! 描述 |- | GetInt32() || 读取32位整数 |- | GetString() || 读取字符串值 |- | GetDateTime() || 读取日期时间 |- | GetOrdinal() || 获取列索引 |} === 多结果集处理 === 当执行返回多个结果集的命令时: <syntaxhighlight lang="csharp"> using (SqlDataReader reader = command.ExecuteReader()) { do // 处理每个结果集 { while (reader.Read()) { // 处理当前结果集行 } } while (reader.NextResult()); // 移动到下一个结果集 } </syntaxhighlight> == 性能优化 == <mermaid> graph TD A[开始查询] --> B{使用DataReader?} B -->|是| C[保持连接打开] C --> D[使用GetXXX方法] D --> E[及时关闭读取器] B -->|否| F[考虑其他方案] </mermaid> 优化建议: * 始终使用`using`语句确保资源释放 * 优先使用列索引而非列名(`reader.GetInt32(0)`比`reader["ProductID"]`更快) * 处理NULL值: <syntaxhighlight lang="csharp"> string name = reader.IsDBNull(1) ? null : reader.GetString(1); </syntaxhighlight> == 高级应用 == === 映射到对象 === <syntaxhighlight lang="csharp"> public List<Product> GetProducts() { var products = new List<Product>(); // ...连接代码... while (reader.Read()) { products.Add(new Product { Id = reader.GetInt32(0), Name = reader.GetString(1), Price = reader.GetDecimal(2) }); } return products; } </syntaxhighlight> === 批量数据处理 === 处理大型数据集时可采用分页读取: <math> \text{分页大小} = \frac{\text{总内存}}{\text{单行内存占用} \times \text{安全系数}} </math> == 实际案例 == '''库存管理系统'''中的实时报表生成: 1. 连接生产数据库 2. 使用DataReader快速遍历百万级库存记录 3. 实时计算库存周转率: <syntaxhighlight lang="csharp"> while (reader.Read()) { var turnover = reader.GetDouble(3) / reader.GetDouble(4); if (turnover < 0.5) AlertSlowMoving(reader.GetString(0)); } </syntaxhighlight> == 限制与替代方案 == '''局限性''': * 不能直接绑定到数据控件(需转换为集合) * 需要手动管理连接 '''替代选择''': * DataAdapter/DataSet:需要断开式访问时 * ORM框架(如Entity Framework):需要对象关系映射时 == 最佳实践总结 == # 始终在`using`块中使用DataReader # 优先使用类型特定的Get方法 # 及时处理NULL值 # 大数据量查询时考虑分页 # 复杂业务逻辑考虑结合DTO使用 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 数据库编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)