news 2026/4/17 3:20:35

吃透 ADO.NET 核心对象,轻松搞定数据库操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
吃透 ADO.NET 核心对象,轻松搞定数据库操作

在 C# 开发中,和数据库打交道是家常便饭,而ADO.NET就是我们操作数据库的“得力助手”。
它的核心对象各司其职,搭配起来即可完成数据的增、删、改、查

本文将系统梳理 ADO.NET 的核心对象、协作流程,并提供完整可用的分页查询实战代码,非常适合作为学习笔记或博客文章直接发布。


一、ADO.NET 核心对象(一个都不能少)

ADO.NET 的数据库操作围绕以下几个核心对象展开,它们分工明确、各司其职。

1️⃣ Connection —— 数据库的“连接器”

作用
负责建立应用程序与数据库之间的物理连接,没有它,所有数据库操作都无法进行。

常用方法

  • Open():打开数据库连接
  • Close():关闭数据库连接

Close vs Dispose 的区别

方法说明
Close()关闭连接,但对象仍可再次Open()
Dispose()释放所有资源,对象不可再使用

最佳实践:使用using语句,自动释放资源。


2️⃣ Command —— 数据库的“指令官”

作用
依附于Connection,用于向数据库发送 SQL 指令或调用存储过程。

核心属性

  • CommandText:SQL 语句或存储过程名
  • Connection:关联的数据库连接
  • CommandTypeText/StoredProcedure

常用方法

  • ExecuteNonQuery():执行增删改,返回受影响行数
  • ExecuteScalar():返回第一行第一列的值
  • ExecuteReader():返回DataReader

3️⃣ DataAdapter —— 数据的“搬运工”

作用
连接数据库DataSet的桥梁,负责数据的读取与回写。

核心方法

  • Fill():从数据库填充 DataSet
  • Update():将 DataSet 的更改同步回数据库

📌 特点:

  • 无需手动管理连接
  • Fill()会自动打开并关闭连接

4️⃣ DataSet —— 内存中的“数据库副本”

作用
用于在内存中暂存数据,完全脱离数据库连接进行操作。

组成结构

DataSet ├── DataTable │ ├── DataRow │ └── DataColumn

优势

  • 支持离线操作
  • 可保存表结构、主键、表关系
  • 适合复杂业务处理

5️⃣ DataReader —— 高性能“数据阅读器”

适用场景
只读、高性能、顺序读取数据。

核心特点

  • 只读(ReadOnly)
  • 只进(ForwardOnly)
  • 极低内存占用

⚠️ 注意事项:

  • 使用期间Connection 必须保持打开
  • 读取完成后必须及时关闭连接

二、ADO.NET 核心对象协作流程

完整的数据库操作流程如下:

  1. 使用Connection打开数据库连接
  2. 使用CommandDataAdapter执行 SQL
  3. 查询结果:
    • 快速读取 →DataReader
    • 离线操作 →DataSet / DataTable
  4. 执行业务逻辑处理

三、实战示例:ADO.NET 分页查询(完整版)

以下示例基于ROW_NUMBER()实现分页,包含:

  • 参数化 SQL
  • DataSet 查询
  • DataTable 转实体

1️⃣ 业务层:分页入口

publicList<Books>GetPageList(intpageIndex,intpageSize){intstart=(pageIndex-1)*pageSize+1;intend=pageIndex*pageSize;DataSetds=dal.GetPageList(start,end);returnDataTableToList(ds.Tables[0]);}

2️⃣ 数据访问层:分页 SQL

publicDataSetGetPageList(intstart,intend){stringsql=@" SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(ORDER BY Id) AS Num FROM Books ) t WHERE t.Num >= @start AND t.Num <= @end";SqlParameter[]ps={newSqlParameter("@start",SqlDbType.Int),newSqlParameter("@end",SqlDbType.Int)};ps[0].Value=start;ps[1].Value=end;returnSqlHelper.Query(sql,CommandType.Text,ps);}

3️⃣ DataTable → 实体列表

publicList<Books>DataTableToList(DataTabledt){List<Books>list=newList<Books>();foreach(DataRowrowindt.Rows){Booksmodel=newBooks();model.Id=row["Id"]!=DBNull.Value?Convert.ToInt32(row["Id"]):0;model.Title=row["Title"].ToString();model.Author=row["Author"].ToString();model.ISBN=row["ISBN"].ToString();if(row["PublishDate"]!=DBNull.Value)model.PublishDate=Convert.ToDateTime(row["PublishDate"]);if(row["UnitPrice"]!=DBNull.Value)model.UnitPrice=Convert.ToDecimal(row["UnitPrice"]);list.Add(model);}returnlist;}

四、ADO.NET 实战优化技巧(必看)

✅ 1. 使用配置文件管理连接字符串

  • App.config / Web.config
  • 避免硬编码,方便环境切换

✅ 2. 封装 SqlHelper 工具类

  • 统一管理 Connection / Command
  • 减少重复代码,提高可维护性

✅ 3. 坚决使用参数化查询

  • 防止 SQL 注入
  • 提升 SQL 执行计划复用率

✅ 4. using 语句释放资源

using(SqlConnectionconn=newSqlConnection(connStr)){conn.Open();...}

五、总结

ADO.NET 虽然不像 EF Core 那样“开箱即用”,但它是所有 ORM 框架的底层基础

👉理解 ADO.NET = 理解数据库访问本质
👉会 ADO.NET = ORM 再复杂也不慌

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 19:28:03

ChromeDriver拦截请求修改VibeVoice默认参数

ChromeDriver拦截请求修改VibeVoice默认参数 在当前AI语音内容爆发式增长的背景下&#xff0c;播客、有声书和虚拟访谈等长对话音频的需求急剧上升。用户不再满足于机械朗读式的单人TTS输出&#xff0c;而是期待具备角色区分、情感表达和长时间连贯性的“对话级”语音合成体验。…

作者头像 李华
网站建设 2026/4/16 17:16:48

screen+支持多点触控的工业场景应用详解

多点触控如何重塑工业HMI&#xff1f;——深度解析screen的实战价值你有没有遇到过这样的场景&#xff1a;在嘈杂的车间里&#xff0c;操作员戴着厚厚的手套&#xff0c;对着控制屏反复点击却毫无响应&#xff1b;或者为了调整一个参数&#xff0c;在层层嵌套的菜单中来回翻找&…

作者头像 李华
网站建设 2026/4/11 20:57:34

GitHub Actions自动化构建VibeVoice镜像版本

GitHub Actions自动化构建VibeVoice镜像版本 在AI内容生成工具快速迭代的今天&#xff0c;一个棘手的问题始终困扰着开发者和创作者&#xff1a;如何让前沿语音合成技术真正“开箱即用”&#xff1f;尤其是在播客、有声书这类需要长时间多角色对话输出的场景中&#xff0c;用户…

作者头像 李华
网站建设 2026/4/15 14:49:36

Windows计划任务定时执行VibeVoice每日播报生成

Windows计划任务定时执行VibeVoice每日播报生成 在内容生产日益追求自动化与个性化的今天&#xff0c;许多播客创作者、企业内宣团队和教育机构都面临一个共性难题&#xff1a;如何以最低的人力成本&#xff0c;持续输出高质量的语音内容&#xff1f;尤其当这些内容需要模拟真实…

作者头像 李华
网站建设 2026/4/17 6:22:22

【视频】GStreamer+WebRTC(七):信号和动作

1、简述 GStreamer 使用 webrtcbin 插件来处理 WebRTC。webrtcbin 中定义了大量的信号(Element Signals)和动作(Element Actions) 信号:通过注册信号对应的回调函数,相应信号,信号由插件在特定时刻发送,使用函数:g_signal_connect 动作:主动触发的插件与定义的的操作…

作者头像 李华
网站建设 2026/4/16 10:08:33

提升内容生产力:用VibeVoice批量生成有声故事

提升内容生产力&#xff1a;用VibeVoice批量生成有声故事 在播客订阅量年均增长超过20%、有声书市场突破百亿美元的今天&#xff0c;音频内容的需求正以前所未有的速度膨胀。然而&#xff0c;传统制作模式却难以跟上——一个专业配音演员录制一小时高质量双人对话&#xff0c;往…

作者头像 李华