掌握 C# 数据库访问:从 ADO.NET 到 Entity Framework

在 C# 开发中,数据库访问是构建应用程序中至关重要的部分。C# 提供了多种方式来访问数据库,包括低级的 ADO.NET 和高级的 ORM(对象关系映射)框架,如 Entity Framework Core。这篇文章将介绍如何使用 C# 进行数据库访问,从 ADO.NET 基础到使用 LINQ 查询数据库,再到事务管理。


1. ADO.NET 基础

ADO.NET 是 .NET 框架中用于访问关系数据库的核心组件,它允许通过 SQL 命令与数据库交互。ADO.NET 包括数据库连接、命令执行和数据读取等操作,适合需要更细粒度控制的场景。

ADO.NET 核心组件

  • Connection:与数据库建立连接。
  • Command:执行 SQL 语句或存储过程。
  • DataReader:读取从数据库返回的结果集。
  • DataAdapter:用于填充 DataSet 的类,适合脱机操作。

连接到数据库并执行 SQL 语句

using (SqlConnection connection = new SqlConnection("your_connection_string"))
{connection.Open();string sql = "SELECT * FROM Products";SqlCommand command = new SqlCommand(sql, connection);using (SqlDataReader reader = command.ExecuteReader()){while (reader.Read()){Console.WriteLine(reader["ProductName"].ToString());}}
}

在这个示例中,我们使用 SqlConnection 连接到数据库,使用 SqlCommand 执行查询,并通过 SqlDataReader 读取数据。这种方法提供了底层的数据库控制,可以用来执行复杂的 SQL 操作。


2. 数据库连接与命令执行

数据库连接 是所有数据库操作的基础,建立连接后,我们可以使用 SQL 命令来进行数据操作。ADO.NET 中的 Command 对象允许执行查询、插入、更新和删除等 SQL 语句。

执行 SQL 插入操作

using (SqlConnection connection = new SqlConnection("your_connection_string"))
{connection.Open();string sql = "INSERT INTO Products (ProductName, Price) VALUES (@name, @price)";SqlCommand command = new SqlCommand(sql, connection);command.Parameters.AddWithValue("@name", "New Product");command.Parameters.AddWithValue("@price", 99.99);int rowsAffected = command.ExecuteNonQuery();Console.WriteLine($"{rowsAffected} row(s) inserted.");
}

在此示例中,SqlCommand.ExecuteNonQuery() 用于执行非查询 SQL 语句,如插入、更新或删除操作。我们使用参数化查询(@name@price)来避免 SQL 注入。


3. Entity Framework Core

Entity Framework Core 是 .NET 中的 ORM 框架,简化了数据库的访问和操作。通过 Entity Framework Core,开发者可以使用 C# 类和 LINQ 查询与数据库交互,而无需编写 SQL 语句。EF Core 适用于大多数常见的数据库操作,并支持 Code First 和 Database First 开发模式。

配置 EF Core

首先,需要在项目中配置 EF Core 和数据库上下文(DbContext)。以 Code First 为例,定义模型类和上下文类:

public class Product
{public int ProductId { get; set; }public string ProductName { get; set; }public decimal Price { get; set; }
}public class AppDbContext : DbContext
{public DbSet<Product> Products { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){optionsBuilder.UseSqlServer("your_connection_string");}
}

使用 EF Core 执行基本操作

使用 DbContext 进行数据库操作非常简单。以下是添加和查询数据的示例:

using (var context = new AppDbContext())
{// 添加新产品var newProduct = new Product { ProductName = "New Product", Price = 99.99M };context.Products.Add(newProduct);context.SaveChanges();// 查询产品var products = context.Products.ToList();foreach (var product in products){Console.WriteLine($"{product.ProductName}: {product.Price}");}
}

EF Core 使得操作数据库更加简单,通过 .Add().ToList() 等方法,可以轻松实现数据的增删查改。


4. 使用 LINQ 查询数据库

LINQ(Language Integrated Query) 是 C# 中用于查询集合的强大工具,EF Core 完全支持使用 LINQ 进行数据库查询。LINQ 查询使代码更加简洁易读,并且支持类型检查,避免了 SQL 语句中的拼写错误。

基本 LINQ 查询

using (var context = new AppDbContext())
{var cheapProducts = context.Products.Where(p => p.Price < 50).OrderBy(p => p.ProductName).ToList();foreach (var product in cheapProducts){Console.WriteLine($"{product.ProductName}: {product.Price}");}
}

在这个示例中,我们使用 LINQ 查询价格低于 50 的产品,并按名称排序。LINQ 查询和 SQL 类似,但它与 C# 紧密结合,可以利用类型安全和 IntelliSense。


5. 事务管理

在数据库操作中,事务管理 确保多步操作作为一个单元执行。如果事务中的任何一步失败,所有更改将被回滚,保证数据一致性。ADO.NET 和 EF Core 都支持事务。

使用 ADO.NET 事务

using (SqlConnection connection = new SqlConnection("your_connection_string"))
{connection.Open();SqlTransaction transaction = connection.BeginTransaction();try{SqlCommand command = new SqlCommand("UPDATE Products SET Price = Price * 1.1", connection, transaction);command.ExecuteNonQuery();command.CommandText = "INSERT INTO Logs (Message) VALUES ('Prices updated')";command.ExecuteNonQuery();transaction.Commit();  // 提交事务}catch{transaction.Rollback();  // 事务回滚}
}

在这个示例中,如果在更新价格或插入日志时发生异常,事务将被回滚。

使用 EF Core 事务

EF Core 也支持事务,可以通过 Database.BeginTransaction() 方法开始事务。

using (var context = new AppDbContext())
{using (var transaction = context.Database.BeginTransaction()){try{// 执行数据库操作var product = context.Products.First();product.Price *= 1.1M;context.SaveChanges();transaction.Commit();  // 提交事务}catch{transaction.Rollback();  // 事务回滚}}
}

EF Core 的事务管理与 ADO.NET 类似,允许你确保多步骤操作的一致性。


结论

C# 提供了多种数据库访问方式,从 ADO.NET 到高级的 Entity Framework Core,每种方式都有其适用的场景。ADO.NET 适合需要更精细控制的低级别操作,而 Entity Framework Core 则为常规数据库访问提供了更加简洁的代码和更高的生产力。

  • ADO.NET 提供底层控制,适合复杂 SQL 操作。
  • Entity Framework Core 简化了数据访问,使用 LINQ 查询和对象映射。
  • 事务管理 在多步骤操作中至关重要,确保数据一致性。

通过掌握这些技术,你可以构建高效且可靠的数据库驱动应用程序。如果你有进一步的问题或需要更深入的示例,欢迎继续探讨!


这篇博客介绍了 C# 数据库访问的基础和高级用法。如果你有任何问题,欢迎联系我或在评论区提出你的问题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559306.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于IDEA+SpringBoot+Vue+Uniapp的投票评选小程序系统的详细设计和实现

2. 详细视频演示 文章底部名片&#xff0c;联系我获取更详细的演示视频 3. 论文参考 4. 项目运行截图 代码运行效果图 代码运行效果图 代码运行效果图 代码运行效果图 代码运行效果图 5. 技术框架 5.1 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框…

大数据毕业设计选题推荐-B站热门视频数据分析-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

AI助力农作物自动采摘,基于嵌入式端超轻量级模型LeYOLO全系列【n/s/m/l】参数模型开发构建作物生产场景下番茄采摘检测计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物&#xff0c;专家设计出来了很多用于采摘不同农作物的大型机械&#xff0c;看着非常震撼&#xff0c;但是我们国内农业的发展还是相对比较滞后的&#xff0…

计算机的错误计算(一百一十八)

摘要 探讨一个不动点的计算精度问题。 不动点是一类特殊的循环迭代。它有形式 例1. 已知迭代[1] 计算 显然&#xff0c;每个 均为 0.5 . 不妨在Visual Studio 2010 下用下列C语言代码计算&#xff1a; #include <stdio.h> #include <math.h>int main() {do…

【大语言模型-论文速读】GPT的不确定性判断

【大语言模型-论文精读】GPT’s Judgements Under Uncertainty Authors: Payam Saeedi and Mahsa Goodarzi 论文&#xff1a;https://arxiv.org/pdf/2410.02820 文章标题翻译 GPT的不确定性判断 Payam Saeedi Rochester Institute of Technology Mahsa Goodarzi The State …

【exp报错注入】

整数范围 最大整数 exp 函数介绍 报错盲注注入 payload分析 709C-ASCII 值就等于我们下面的 7091-1 &#xff0c;C就是我们要猜的值&#xff0c;当我们猜测的值和ASCII码相等时&#xff0c;那么exp就不会出现报错&#xff0c;因为1-1还是等于709&#xff1a; 练习 id1 an…

【AIGC】OpenAI API在快速开发中的实践与应用:优化ChatGPT提示词Prompt加速工程

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;使用最新型号确保最佳实践利用最新模型进行高效任务处理为什么要选择最新模型&#xff1f;结论 &#x1f4af;指令与上下文的分隔最佳实践分隔指令和上下文的重要性使用符…

Win32 API 控制台鼠标操作、坐标获取与相关函数介绍

Win32 API 控制台鼠标操作、坐标获取与相关函数介绍 一、前置介绍读取控制台输入缓冲区数据 ReadConsoleInput 函数控制台输入缓冲区中的输入事件 INPUT_RECORD 结构鼠标输入事件 MOUSE_EVENT_RECORD 结构更改输入模式 SetConsoleMode 函数 二、鼠标坐标获取(以下代码环境为 VS…

PCL 3D-SIFT关键点检测(Z方向梯度约束

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 SIFT关键点检测 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#…

SQL优化 where谓词条件OR优化

1.测试表&#xff0c;及测试语句where条件中OR对应两个字段选择度很高 create table t618 as select * from dba_objects; select object_name from t618 where (object_id12043 or DATA_OBJECT_ID12043) and STATUSVALID; 2.没有索引情况下&#xff0c;全表扫描逻辑读…

C++核心编程和桌面应用开发 第九天(静态多态 动态多态 纯虚函数 抽象类 虚析构 纯虚析构 向上向下类型转换 重载重写重定义)

目录 1.1静态多态 1.2动态多态 1.2.1满足条件 1.2.2动态多态的使用条件 1.3纯虚函数和抽象类 1.3.1纯虚函数 1.3.2抽象类 1.4虚析构/纯虚析构 1.5向上向下类型转换 1.5.1向下类型转换 1.5.2向上类型转换 1.5.3多态中的类型转换 1.6重载重写重定义 1.6.1重载 1.6…

qwt实现码流柱状图多色柱体显示

qwt实现码流柱状图多色柱体显示 1. 前言2. qt实现柱状图3.qwt基础说明3.1 qwt安装与使用3.1.1 下载qwt源码3.1.2 编译3.1.3 安装3.1.4 使用3.2 QwtPlotBarChart类3.2.1画图步骤3.2.2 specialSymbol3.3.3 barTitle4 BsBarChart定制4.1 每个柱体可以显示不同的颜色4.2 每个柱体可…

MFC项目如何使用hiredis库连接redis

如何在windows平台使用c连接redis 1. 下载hiredis的vs工程文件2. 使用vs2022编译hiredis3.项目中调用4. 集群连接5. 简单的封装下 最近需要在windows PC终端读取redis数据。我这里使用hiredis连接redis. 工程是vs2022开发的。 1. 下载hiredis的vs工程文件 windows平台需要自己…

【C/C++】错题记录(七)

题目一 题目二 C在调用函数时&#xff0c;当实参和形参的数据类型不一致时&#xff0c;会发生数据类型转换&#xff01;将低精度转换为高精度时&#xff0c;由编译器隐式完成&#xff1b;将高精度转换为低精度时&#xff0c;必须用强制类型转换运算符&#xff1b; static_cast…

Redis:分布式 - 哨兵

Redis&#xff1a;分布式 - 哨兵 概念哨兵 Docker 搭建哨兵分布式选举流程 概念 Redis 的主从复制模式下&#xff0c;一旦主节点由于故障不能提供服务&#xff0c;需要人工进行主从切换&#xff0c;同时大量的客户端需要被通知切换到新的主节点上&#xff0c;对于上了一定规模…

浏览器动态移动的小球源码分享

浏览器动态移动的小球源码分享 <script>(function(a){var width100,height100,borderRadius100,circlefunction(){};circle.prototype{color:function(){let colour "#"Math.floor(Math.random()*255).toString(16)Math.floor(Math.random()*255).toString…

Linux块设备驱动实验

直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 本文仅作为个人笔记使用&#xff0c;方便进一步记录自己的实践总结。 前面我们都是在学习字符设备驱动&#xff0c;本章我们来学习一下块设备驱动框架&#xff0c;块设备驱动是Linux 三大驱动类型之一。块设备驱动要远…

Fiddler配合wireshark解密ssl

环境&#xff1a; win11&#xff08;wireshark&#xff09;--虚拟机win7&#xff08;Fiddler&#xff09;---虚拟机win7&#xff08;HTTPS站点&#xff09; 软件安装问题&#xff1a; 需要.net环境&#xff0c;NDP461-KB3102436-x86-x64-AllOS-ENU.exe。 安装fiddler后安装下…

vite项目打包md5报‘default‘ is not exported错误的解决方法

报错如下&#xff1a; 某一个包中用es方式引入md5模块&#xff0c;导致打包报错&#xff0c;经过一番探究测试&#xff0c;发现我的项目中用了“vite-plugin-require-transform”这个插件&#xff0c;是这个插件在做转换的时候报错了&#xff0c;如果你也是这个原因可按我的方式…

代码随想录day24:贪心part2

121. 买卖股票的最佳时机 class Solution {public int maxProfit(int[] prices) {int ans 0;int minPrice prices[0];for(int p : prices){ans Math.max(ans, p - minPrice);minPrice Math.min(p, minPrice);}return ans;} } 运用前缀和思想&#xff0c; 从左到右枚举卖…