C# 使用ADO.NET访问数据全解析
.NET学习资料
.NET学习资料
.NET学习资料
在 C# 的应用开发中,数据访问是极为关键的部分。ADO.NET作为.NET 框架下用于数据访问的核心技术,能够帮助开发者便捷地与各类数据源进行交互。本文将深入剖析ADO.NET,带你掌握使用 C# 通过ADO.NET访问数据的方法。
一、ADO.NET简介
ADO.NET(ActiveX Data Objects for.NET)是一组类库,专门用于在.NET 环境中进行数据访问。它支持多种数据源,例如 SQL Server、Oracle、MySQL 等,为开发者提供了统一的数据访问接口,极大地简化了数据访问的流程。
(一)核心组件
Connection:负责建立与数据源的连接,如SqlConnection用于连接 SQL Server 数据库。不同的数据源对应不同的Connection实现类。
Command:可执行 SQL 命令或存储过程,像SqlCommand就用于执行针对 SQL Server 数据库的命令。通过它,开发者能够实现数据的查询、插入、更新和删除等操作。
DataReader:以只读、只进的方式高效读取数据源中的数据,例如SqlDataReader从 SQL Server 数据库读取数据。它适用于需要快速读取大量数据且不需要对数据进行复杂操作的场景。
DataAdapter:在数据源和DataSet之间充当桥梁,用于数据的填充和更新。比如SqlDataAdapter可以从 SQL Server 数据库中获取数据并填充到DataSet中,也能将DataSet中的数据更新回数据库。
DataSet:它是一个内存中的数据缓存,类似于一个小型的数据库,可存储多个DataTable以及它们之间的关系。DataSet允许开发者在断开与数据源连接的情况下对数据进行操作,提高了应用程序的灵活性和性能。
二、使用ADO.NET访问数据的步骤
(一)连接数据库
首先要建立与数据库的连接,以下是连接 SQL Server 数据库的示例代码:
string connectionString = "server=your_server;database=your_database;user id=your_user;password=your_password;";
using (SqlConnection connection = new SqlConnection(connectionString))
{try{connection.Open();Console.WriteLine("数据库连接成功!");// 在这里进行后续的数据操作}catch (SqlException ex){Console.WriteLine("数据库连接错误: " + ex.Message);}
}
在上述代码中,connectionString包含了连接数据库所需的服务器地址、数据库名称、用户名和密码等信息。使用using语句可以确保SqlConnection对象在使用完毕后正确释放资源。
(二)执行 SQL 命令
查询数据:使用SqlCommand类执行 SQL 查询语句,并通过SqlDataReader读取数据。
string query = "select * from Employees";
using (SqlCommand command = new SqlCommand(query, connection))
{SqlDataReader reader = command.ExecuteReader();while (reader.Read()){Console.WriteLine(reader["EmployeeName"].ToString());}reader.Close();
}
这段代码中,query是 SQL 查询语句,SqlCommand对象根据该语句和已建立的连接来执行查询。ExecuteReader方法返回一个SqlDataReader对象,通过while循环可以逐行读取查询结果。
插入数据:插入数据同样使用SqlCommand对象,但需要使用ExecuteNonQuery方法,该方法返回受影响的行数。
string insertQuery = "insert into Employees (EmployeeName, Department) values ('John Doe', 'HR')";
using (SqlCommand insertCommand = new SqlCommand(insertQuery, connection))
{int rowsAffected = insertCommand.ExecuteNonQuery();Console.WriteLine(rowsAffected + " 行数据已插入。");
}
更新数据:更新数据的操作与插入数据类似,只需修改 SQL 语句。
string updateQuery = "update Employees set Department = 'IT' where EmployeeName = 'John Doe'";
using (SqlCommand updateCommand = new SqlCommand(updateQuery, connection))
{int rowsAffected = updateCommand.ExecuteNonQuery();Console.WriteLine(rowsAffected + " 行数据已更新。");
}
删除数据:删除数据也是通过SqlCommand和ExecuteNonQuery方法实现。
string deleteQuery = "delete from Employees where EmployeeName = 'John Doe'";
using (SqlCommand deleteCommand = new SqlCommand(deleteQuery, connection))
{int rowsAffected = deleteCommand.ExecuteNonQuery();Console.WriteLine(rowsAffected + " 行数据已删除。");
}
(三)使用 DataAdapter 和 DataSet
DataAdapter和DataSet提供了离线数据访问的能力,以下是一个示例:
string selectQuery = "select * from Employees";
using (SqlDataAdapter adapter = new SqlDataAdapter(selectQuery, connection))
{DataSet dataset = new DataSet();adapter.Fill(dataset, "Employees");DataTable table = dataset.Tables["Employees"];foreach (DataRow row in table.Rows){Console.WriteLine(row["EmployeeName"].ToString());}
}
在这个示例中,SqlDataAdapter根据查询语句从数据库中获取数据,并填充到DataSet中。DataSet中的数据可以在离线状态下进行操作,操作完成后再通过DataAdapter将更改更新回数据库。
三、异常处理
在进行数据库操作时,异常处理至关重要,以确保应用程序的稳定性。通常使用try-catch-finally结构来处理异常。
try
{// 数据库操作代码string connectionString = "server=your_server;database=your_database;user id=your_user;password=your_password;";using (SqlConnection connection = new SqlConnection(connectionString)){connection.Open();string query = "select * from Employees";using (SqlCommand command = new SqlCommand(query, connection)){SqlDataReader reader = command.ExecuteReader();while (reader.Read()){Console.WriteLine(reader["EmployeeName"].ToString());}reader.Close();}}
}
catch (SqlException ex)
{Console.WriteLine("数据库错误: " + ex.Message);
}
finally
{// 这里可以添加释放资源的代码,如关闭连接等
}
在try块中放置数据库操作代码,catch块捕获并处理可能出现的SqlException异常,finally块用于执行无论是否发生异常都需要执行的代码,例如关闭数据库连接。
通过以上内容,你已经对 C# 使用ADO.NET访问数据有了全面的了解。在实际开发中,你可以根据具体需求灵活运用这些知识,构建出高效、稳定的数据访问功能。
相关文章:
C# 使用ADO.NET访问数据全解析
.NET学习资料 .NET学习资料 .NET学习资料 在 C# 的应用开发中,数据访问是极为关键的部分。ADO.NET作为.NET 框架下用于数据访问的核心技术,能够帮助开发者便捷地与各类数据源进行交互。本文将深入剖析ADO.NET,带你掌握使用 C# 通过ADO.NET访…...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter4-变量、作用域与内存
四、变量、作用域与内存 正如 ECMA-262 所规定的,JavaScript 变量是松散类型的,而且变量不过就是特定时间点一个特定值的名称而已。由于没有规则定义变量必须包含什么数据类型,变量的值和数据类型在脚本生命期内可以改变。 ECMAScript 变量可…...
Unity扩展编辑器使用整理(一)
准备工作 在Unity工程中新建Editor文件夹存放编辑器脚本, Unity中其他的特殊文件夹可以参考官方文档链接,如下: Unity - 手册:保留文件夹名称参考 (unity3d.com) 一、菜单栏扩展 1.增加顶部菜单栏选项 使用MenuItemÿ…...
如何查看:Buildroot所使用Linux的版本号、gcc交叉编译工具所使用的Linux的版本号、开发板上运行的Linux系统的版本号
定义编号①②③的含义 将“Buildroot所使用Linux的版本号”编号为① 将“gcc交叉编译工具所使用的Linux的版本号”编号为② 将“开发板上运行的Linux系统的版本号”编号为③ 查看①和②的共同方法(通过sysroot查看) 由于此二者都有目录sysroot,而通过目录sysroot…...
Java实战经验分享
1. 项目优化与性能提升 面试问题: 聊聊你印象最深刻的项目,或者做了哪些优化 你在项目中如何解决缓存穿透问题? 缓存穿透是我们做缓存优化时最常遇到的问题,特别是当查询的对象在数据库中不存在时,缓存层和数据库都会…...
python安装包,!pip 和不加!命令,功能区别一览
python安装包,!pip 和不加!命令,功能区别一览 1. !pip2. pip(不加 !)3. 区别总结4. 推荐用法5. 注意事项6. 总结 在 Jupyter Notebook 或 IPython 环境中,!pip 和 pip 的功能有所不同,主要体现在执行环境和…...
html转PDF文件最完美的方案(wkhtmltopdf)
目录 需求 一、方案调研 二、wkhtmltopdf使用 如何使用 文档简要说明 三、后端服务 四、前端服务 往期回顾 需求 最近在做报表类的统计项目,其中有很多指标需要汇总,网页内容有大量的echart图表,做成一个网页去浏览,同时…...
我最近在干什么【2】
前言 这系列的上一篇是2024.12.05写的,现在是2025.02.06,这都两个月🤔小久。 不是完整全面的技术分享,话题聚焦个人成长(学的技术、了解到的信息、看的书……) 方面。文章偏意识流点,单纯分享我…...
deepseek本地部署
DeepSeek本地部署详细指南 DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,这里记录自己DeepSeek本地部署流程。 主机环境 cpu:amd 7500Fgpu:406…...
【Reading Notes】Favorite Articles from 2025
文章目录 1、January2、February3、March4、April5、May6、June7、July8、August9、September10、October11、November12、December 1、January 极越之后,中国车市只会倒下更多人(2025年01月01日) 在这波枪林弹雨中,合资品牌中最…...
配置@别名路径,把@/ 解析为 src/
路径解析配置 webpack 安装 craco npm i -D craco/craco 项目根目录下创建文件 craco.config.js ,内容如下 const path require(path) module.exports {webpack: {// 配置别名alias: {// 约定: 使用 表示src文件所在路径: path.resolve(__dirname,src)…...
【LeetCode 刷题】回溯算法(2)-分割问题
此博客为《代码随想录》二叉树章节的学习笔记,主要内容为回溯算法分割问题相关的题目解析。 文章目录 131.分割回文串93.复原IP地址 131.分割回文串 题目链接 class Solution:def partition(self, s: str) -> List[List[str]]:res, path [], []def check(s: …...
AJAX笔记原理篇
黑马程序员视频地址: AJAX-Day03-01.XMLHttpRequest_基本使用https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p33https://www.bilibili.com/video/BV1MN411y7pw?vd_sour…...
一表总结 Java 的3种设计模式与6大设计原则
设计模式通常分为三大类:创建型、结构型和行为型。 创建型模式:主要用于解决对象创建问题结构型模式:主要用于解决对象组合问题行为型模式:主要用于解决对象之间的交互问题 创建型模式 创建型模式关注于对象的创建机制…...
[paddle] 矩阵的分解
特征值 设 A A A 是一个 n n n \times n nn 的方阵, λ \lambda λ 是一个标量, v \mathbf{v} v 是一个非零向量。如果满足以下方程: A v λ v A\mathbf{v} \lambda\mathbf{v} Avλv 则称 λ \lambda λ 为矩阵 A A A 的一个 特征值…...
极限的深入探讨:从概念到应用的完整指南
极限的深入探讨:从概念到应用的完整指南 一、历史背景与发展 1. 极限概念的演变 在维尔斯特拉斯(Karl Weierstrass,1815-1897)提出他的严格定义之前,极限概念经历了漫长的发展过程: 古希腊时期…...
康谋方案 | BEV感知技术:多相机数据采集与高精度时间同步方案
随着自动驾驶技术的快速发展,车辆准确感知周围环境的能力变得至关重要。BEV(Birds-Eye-View,鸟瞰图)感知技术,以其独特的视角和强大的数据处理能力,正成为自动驾驶领域的一大研究热点。 一、BEV感知技术概…...
UE学习日志#23 C++笔记#9 编码风格
注:此文章为学习笔记,只记录个人不熟悉或备忘的内容 1 为代码编写文档 1.1 使用注释的原因 1.说明用途的注释 应该注释的信息:输入,输出含义,参数的类型含义,错误条件和处理,预期用途&#x…...
更换IP属地会影响网络连接速度吗
在数字化时代,网络连接速度对于个人用户和企业来说都至关重要。无论是日常浏览网页、观看视频,还是进行在线办公、游戏娱乐,网络速度都直接影响着我们的体验。而IP属地,作为网络连接中的一个重要元素,其变动是否会引发…...
深入探索 C++17 特征变量模板 (xxx_v)
文章目录 一、C++类型特征的前世今生二、C++17特征变量模板闪亮登场三、常见特征变量模板的实际应用(一)基本类型判断(二)指针与引用判断四、在模板元编程中的关键作用五、总结与展望在C++的持续演进中,C++17带来了许多令人眼前一亮的特性,其中特征变量模板(xxx_v)以其…...
C# 中 Guid类 使用详解
总目录 前言 C# 中的 Guid 类(全局唯一标识符,Globally Unique Identifier)用于生成和操作 128 位的唯一标识符。它在需要唯一标识的场景(如数据库主键、分布式系统等)中广泛使用。 一、什么是 Guid Guid(…...
生产环境的 MySQL事务隔离级别
MySQL 数据库的默认隔离级别是 RR( 可重复读 ),但是很多大公司把隔离级别改成了 RC(读已提交),主要原因是为了提高并发和降低死锁概率 为了解决幻读的问题 RR 相比 RC 多了间隙锁( gap lock )和临键锁( next-keylock )。而 RC 中修改数据仅用行锁&#…...
无用知识研究:std::initializer_list的秘密
先说结论,用std::initializer_list初始化vector,内部逻辑是先生成了一个临时数组,进行了拷贝构造,然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化,这个动作又触发了拷贝…...
web安全:任意文件下载漏洞
背景: 点击对应名字,下载对应图片。但服务器还存在其他文件,只是前端没有展示出来。通过模拟路径下载,可以获取到意想不到的数据。 看点击代码: 如果模拟没有前端的图片,也会发现下载了 所以这个叫任…...
oracle:索引(B树索引,位图索引,分区索引,主键索引,唯一索引,联合索引/组合索引,函数索引)
索引通过存储列的排序值来加快对表中数据的访问速度,帮助数据库系统快速定位到所需数据,避免全表扫描 B树索引(B-Tree Index) B树索引是一种平衡树结构,适合处理范围查询和精确查找。它的设计目标是保持数据有序,并支持高效的插入…...
大模型实战篇之Deepseek二、一键部署DeepSeek-V3和DeepSeek-R1模型
一键部署DeepSeek-V3和DeepSeek-R1模型:3步,0代码! 随着人工智能技术的飞速发展,越来越多的企业和开发者希望将强大的AI模型快速应用到实际业务中。DeepSeek作为一款高性能的语言模型,已经在多个领域展现出巨大的应用潜力。然而,传统的模型部署流程往往复杂且耗时。今天,…...
【CPP】CPP经典面试题
文章目录 引言1. C 基础1.1 C 中的 const 关键字1.2 C 中的 static 关键字 2. 内存管理2.1 C 中的 new 和 delete2.2 内存泄漏 3. 面向对象编程3.1 继承和多态3.2 多重继承 4. 模板和泛型编程4.1 函数模板4.2 类模板 5. STL 和标准库5.1 容器5.2 迭代器 6. 高级特性6.1 移动语义…...
Windows 中学习Docker环境准备2、Docker Desktop中安装ubuntu
Windows 中学习Docker环境准备1、Win11安装Docker Desktop Windows 中学习Docker环境准备2、Docker Desktop中安装ubuntu Windows 中学习Docker环境准备3、在Ubuntu中安装Docker 需要更多Docker学习视频和资料,请文末联系 一、安装 Docker Desktop 下载 Docker…...
C++11详解(三) -- 可变参数模版和lambda
文章目录 1.可变模版参数1.1 基本语法及其原理1.2 包扩展1.3 empalce系列接口1.3.1 push_back和emplace_back1.3.2 emplace_back在list中的使用(模拟实现) 2. lambda2.1 lambda表达式语法 1.可变模版参数 1.1 基本语法及其原理 1. C11支持可变参数模版&…...
网站打开提示不安全
当网站打开时显示“不安全”提示(通常表现为浏览器地址栏中出现“不安全”字样或红色警告图标),这意味着网站未使用有效的SSL证书或HTTPS协议,导致浏览器认为连接不安全。以下是解决这一问题的详细步骤: 一. 原因分析 …...
