C#语言的数据库编程
C#语言的数据库编程
在现代软件开发中,数据库是不可或缺的一部分。无论是企业级应用还是个人项目,数据的存储与管理都是程序的核心功能之一。C#作为一种强类型、面向对象的编程语言,广泛应用于Windows平台的开发,尤其是在构建与数据库交互的应用时,其强大的功能和丰富的库支持使得开发变得相对容易。本文将深入探讨C#语言的数据库编程,覆盖基础知识、ADO.NET、Entity Framework等核心概念以及一些实用示例。
一、C#与数据库编程的基础
在开始数据库编程之前,首先要了解一些基础概念:
1. 数据库的基本组成
数据库通常由以下几个部分组成:
- 表:数据库中存储数据的核心单位,表由行和列组成。
- 行:表中的一条记录,表示一个具体的数据项。
- 列:表中的一个字段,定义了数据项的属性。
- 主键:唯一标识表中每一行的字段,确保数据的唯一性。
- 外键:用于在不同表之间建立联系的字段。
2. 数据库管理系统(DBMS)
常见的数据库管理系统包括:
- 关系型数据库:如SQL Server、MySQL、PostgreSQL、Oracle等。
- 非关系型数据库:如MongoDB、Redis等。
本文主要集中于关系型数据库的编程,从而使用C#与SQL Server进行交互。
二、ADO.NET入门
ADO.NET是用于与数据源进行交互的核心组件,提供了全面的功能,用于数据访问、更新和管理。
1. ADO.NET的组成
ADO.NET的核心组件包括:
- Connection:表示与数据库的连接。
- Command:用于执行数据库命令(如查询和更新)。
- DataReader:用于从数据库中读取数据的高效方式。
- DataSet:用于在内存中保存数据的容器,可以看作是多个DataTable的集合。
2. 连接数据库
在使用C#进行数据库编程时,第一步通常是创建与数据库的连接。下面是一个简单的示例,展示如何使用SqlConnection连接到SQL Server数据库。
```csharp using System; using System.Data.SqlClient;
class Program { static void Main() { // 连接字符串 string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";
using (SqlConnection connection = new SqlConnection(connectionString)){try{// 打开连接connection.Open();Console.WriteLine("数据库连接成功!");}catch (Exception ex){Console.WriteLine("数据库连接失败: " + ex.Message);}}
}
} ```
3. 执行命令
连接成功后,我们可以使用SqlCommand执行SQL命令。以下示例演示了如何查询数据:
```csharp using System; using System.Data.SqlClient;
class Program { static void Main() { string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";
using (SqlConnection connection = new SqlConnection(connectionString)){connection.Open();string sqlQuery = "SELECT * FROM Users";using (SqlCommand command = new SqlCommand(sqlQuery, connection)){SqlDataReader reader = command.ExecuteReader();while (reader.Read()){Console.WriteLine($"用户ID: {reader["UserId"]}, 用户名: {reader["UserName"]}");}}}
}
} ```
三、数据操作
1. 插入数据
要向数据库插入数据,我们可以使用INSERT
语句。以下是插入用户数据的示例代码:
```csharp using System; using System.Data.SqlClient;
class Program { static void Main() { string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";
using (SqlConnection connection = new SqlConnection(connectionString)){connection.Open();string insertQuery = "INSERT INTO Users (UserName) VALUES (@UserName)";using (SqlCommand command = new SqlCommand(insertQuery, connection)){command.Parameters.AddWithValue("@UserName", "新用户");int rowsAffected = command.ExecuteNonQuery();Console.WriteLine($"{rowsAffected} 行被插入。");}}
}
} ```
2. 更新数据
更新数据的方式与插入相似,只需使用UPDATE
语句:
```csharp using System; using System.Data.SqlClient;
class Program { static void Main() { string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";
using (SqlConnection connection = new SqlConnection(connectionString)){connection.Open();string updateQuery = "UPDATE Users SET UserName = @NewName WHERE UserId = @UserId";using (SqlCommand command = new SqlCommand(updateQuery, connection)){command.Parameters.AddWithValue("@NewName", "更新后的用户");command.Parameters.AddWithValue("@UserId", 1); // 假设要更新的用户ID为1int rowsAffected = command.ExecuteNonQuery();Console.WriteLine($"{rowsAffected} 行被更新。");}}
}
} ```
3. 删除数据
删除数据使用DELETE
语句,例如:
```csharp using System; using System.Data.SqlClient;
class Program { static void Main() { string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";
using (SqlConnection connection = new SqlConnection(connectionString)){connection.Open();string deleteQuery = "DELETE FROM Users WHERE UserId = @UserId";using (SqlCommand command = new SqlCommand(deleteQuery, connection)){command.Parameters.AddWithValue("@UserId", 1); // 假设要删除的用户ID为1int rowsAffected = command.ExecuteNonQuery();Console.WriteLine($"{rowsAffected} 行被删除。");}}
}
} ```
四、使用Entity Framework
ADO.NET虽然功能强大,但在处理复杂的数据操作时,手动的代码可能会变得繁琐。Entity Framework(EF)作为一个对象关系映射(ORM)框架,提供了更高层次的抽象,使得数据库操作更加简洁和直观。
1. 安装Entity Framework
通过NuGet包管理器安装Entity Framework:
bash Install-Package EntityFramework
2. 创建数据模型
定义一个代表数据表的模型类。例如,一个用户类可以如下定义:
csharp public class User { public int UserId { get; set; } public string UserName { get; set; } }
3. 创建数据库上下文
创建一个数据库上下文类,用于与数据库交互:
```csharp using System.Data.Entity;
public class MyDbContext : DbContext { public DbSet Users { get; set; } } ```
4. CRUD操作示例
使用Entity Framework进行CRUD操作十分简单。以下是一个简单的示例:
```csharp using System; using System.Linq;
class Program { static void Main() { using (var context = new MyDbContext()) { // 插入数据 var newUser = new User { UserName = "新用户" }; context.Users.Add(newUser); context.SaveChanges(); Console.WriteLine("用户已插入。");
// 查询数据var user = context.Users.FirstOrDefault(u => u.UserId == newUser.UserId);Console.WriteLine($"查询到用户: {user.UserName}");// 更新数据user.UserName = "更新后的用户";context.SaveChanges();Console.WriteLine("用户已更新。");// 删除数据context.Users.Remove(user);context.SaveChanges();Console.WriteLine("用户已删除。");}
}
} ```
五、总结
本文探讨了C#语言在数据库编程中的应用,介绍了ADO.NET的基本概念和使用方法,以及如何利用Entity Framework简化数据库操作。通过示例代码,演示了常见的数据库操作:连接、查询、插入、更新和删除。在实际开发中,还可以根据业务需求进行扩展和优化,更好地利用数据库的性能。
未来的数据库编程中,随着大数据和云计算的发展,可能会有更多的技术和工具涌现,而C#作为一门灵活的语言,将持续发挥其作用。无论是传统关系数据库还是新兴的非关系数据库,了解其基本原理与操作方法,将拓宽开发者的技术视野。
希望本文能够帮助读者更好地理解和掌握C#的数据库编程技能,为实际项目的开发打下坚实的基础。
相关文章:
C#语言的数据库编程
C#语言的数据库编程 在现代软件开发中,数据库是不可或缺的一部分。无论是企业级应用还是个人项目,数据的存储与管理都是程序的核心功能之一。C#作为一种强类型、面向对象的编程语言,广泛应用于Windows平台的开发,尤其是在构建与数…...

时频分析之S变换
S变换的提出 1996年,由R.G Stockwell 提出了S变换,和其他时频分析工具一样,通过S变换,我们可以同时从时域以及频域观察一个信号的能量分布。S变换融合了短时傅里叶变换和小波变换的优点。关于S变换,最早发表于TSP上的…...

第二十八周学习周报
目录 摘要Abstract1 GFPGAN1.1 总体结构1.2 实验研究1.3 代码分析 总结 摘要 本周主要的学习内容是GFPGAN模型。GFPGAN是一种基于生成对抗网络(GAN)的模型,其利用封装在预训练的人脸GAN中的丰富多样的先验进行人脸图像的修复。这种生成面部先验(GFP&…...
SurfaceFlinger MessageQueue原理
SurfaceFlinger MessageQueue 有2个作用: 处理SurfaceFlinger INVALIDATE、REFRESH事件管理SurfaceFlinger主线程挂起和恢复 SurfaceFlinger::run() { while (true) { mEventQueue->waitMessage(); } } waitMessage {do {IPCThreadState::self()->flushComm…...
component-动态控制 div width 的值 根据传入的变量决定width的值 vue
1.实现 根据参数的值,div显示不同的长度 <div class"node-line" :style"lineProgress"></div> <script>export default {name: "trainSummaryInfo",data(){return{linePercentage:200,}},computed:{lineProgress…...

C#中的常用集合
目录 一、动态数组ArrayList 二、List 三、栈(Stack) 四、队列(Queue) 五、字典(Dictionary),int> 一、动态数组ArrayList ArrayList 是 C# 中提供的一种动态数组类,位于命名空间 Syste…...

插入实体自增主键太长,mybatis-plaus自增主键
1、问题 spring-boot整合mybtais执行insert语句时,主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2)数据库主键的种子值设置的多少 3、解决问题 1)数据库主键设置的时自增 3)种子值是1 所以排查是数据库的问题 4、继…...

晨辉面试抽签和评分管理系统之一:考生信息管理和编排
晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...

【MySQL】MVCC详解, 图文并茂简单易懂
欢迎来到啊妮莫的学习小屋 祝读本文的朋友都天天开心呀 目录 MVCC简介快照读与当前读快照读当前读 隔离级别隐藏字段和Undo Log版本链✨MVCC原理--ReadView✨ReadView简介设计思路适用隔离级别重要内容 ReadView规则MVCC整体流程 不同隔离级别下的MVCC读已提交可重复读 总结 M…...
中国数字化发展的问题与机会
橙蜂智能公司致力于提供先进的人工智能和物联网解决方案,帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能,如智能化推荐、…...

【ROS2】☆ launch之Python
☆重点 ROS1和ROS2其中一个很大区别之一就是launch的编写方式。在ROS1中采用xml格式编写launch,而ROS2保留了XML 格式launch,还另外引入了Python和YAML 编写方式。选择哪种编写取决于每位开发人员的爱好,但是ROS2官方推荐使用Python方式编写…...

如何稳定使用 O1 / O1 Pro,让“降智”现象不再困扰?
近期,不少朋友在使用 O1 或 O1 Pro 模型时,都会碰到“降智”或“忽高忽低”的智力波动,比如无法识图、无法生成图片、甚至回答准确度也不稳定。面对这些问题,你是不是也感到头疼呢? 为了找到更可靠的解决办法…...
zookeeper监听机制(Watcher机制)
文章目录 引言I zookeeper监听机制Watcher机制实现分布式的通知功能触发事件种类Watcher的三个过程II watch机制特点一次性触发事件封装event异步发送先注册再触发常见的通知状态和事件类型III 应用案例(Kafka)Kafka的消息模型Kafka在Zookeeper中保存的元数据Kafka 基于Contr…...
docker 启动 nacos 单机模式
docker 启动 nacos 单机模式 # 拉取镜像# 启动,如果不拉镜像会自动拉取最新的 image docker run --name standalong_nacos -p 8848:8848 -p 9848:9848 -p 9849:9849 -e MODEstandalone -d nacos/nacos-server# 状态查看外部访问验证 输入部署的 docker ip 地址以及…...

学习threejs,导入babylon格式的模型
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.BabylonLoader babyl…...

03.MPLS静态LSP配置实验
MPLS静态LSP配置实验 1、实验环境2、基础配置开启全局mpls接口下开启mpls配置静态LSP配置FEC从1.1.1.1到3.3.3.3配置FEC从3.3.3.3到1.1.1.13、信息查看查看LFIB表(标签转发信息表)查看FIB表(转发信息表)查看详细FFIB表tracert lsp iptracert -vping lsp ip4、抓包验证1、实…...
程序血缘分析技术在工商银行软件工程中的应用
当前,随着软件领域技术更新换代速度的日益加快,市场需求也变得更加多样化和个性化,业界普遍通过加速产品迭代来满足客户需求,但在此过程中也暴露出一些研发管理痛点问题,如服务和程序类资产信息分散于各个不同的应用和系统中,信息归集费时费力;设计、开发和测试人员无法…...

计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask 大
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

macOS 使用 FreeRDP 远程访问 Windows:完整指南20250109
🖥️ macOS 使用 FreeRDP 远程访问 Windows:完整指南 引言 随着远程办公需求的快速增长,跨平台远程管理已经成为不可或缺的技能之一。作为一款开源轻量的远程桌面协议实现工具,FreeRDP 为 macOS 用户提供了一个简单、高效的解决…...

Java agent
Java Agent是一种特殊的Java程序,它可以在JVM启动时或运行时动态加载,用于监控和修改其他Java应用程序的行为。通过Java Agent,开发者可以在不修改目标应用程序源码的情况下,动态地插入功能,如性能分析、日志记录…...
[蓝桥杯]采油
采油 题目描述 LQ 公司是世界著名的石油公司,为世界供应优质石油。 最近,LQ 公司又在森林里发现了一大片区域的油田,可以在这个油田中开采 nn 个油井。 LQ 公司在这 nn 个油井之间修建了 n−1n−1 条道路,每条道路连接两个油井…...
NoSQl之Redis部署
一、Redis 核心概念与技术定位 1. 数据库分类与 Redis 的诞生背景 关系型数据库的局限性 数据模型:基于二维表结构,通过 SQL 操作,强一致性(ACID 特性),适合结构化事务场景(如银行转账、订单管…...

vue+elementui 网站首页顶部菜单上下布局
菜单集合后台接口动态获取,保存到store vuex状态管理器 <template><div id"app"><el-menu:default-active"activeIndex2"class"el-menu-demo"mode"horizontal"select"handleSelect"background-…...

【MATLAB去噪算法】基于CEEMDAN联合小波阈值去噪算法(第四期)
CEEMDAN联合小波阈值去噪算法相关文献 一、EMD 与 EEMD 的局限性 (1)EMD (经验模态分解) 旨在自适应地将非线性、非平稳信号分解成一系列 本征模态函数 (IMFs),这些 IMFs 从高频到低频排列。 核心问题:模态混合 (Mode Mixing) 同…...
极限复习c++
一、核心语法必背 1. 指针 vs 引用(简答题高频) 区别指针引用定义存储地址的变量,可改指向变量的别名,绑定后不可改初始化可空(nullptr)、延迟初始化必须初始化,不能引用空值访问需解引用&…...

告别数据泥沼,拥抱智能中枢:King’s四位一体重塑科研生产力
在现代科研的战场上,数据堪称科研人员手中的“弹药”。然而,许多实验室却深陷数据管理的泥沼:硬盘里堆满了不同年份的实验记录,U盘里塞着各种格式的谱图,Excel表格里还留着手动计算的痕迹……,当科研人员想…...

物联网数据归档之数据存储方案选择分析
在上一篇文章中《物联网数据归档方案选择分析》中凯哥分析了归档设计的两种方案,并对两种方案进行了对比。这篇文章咱们就来分析分析,归档后数据应该存储在哪里?及存储方案对比。 这里就选择常用的mysql及taos数据库来存储归档后的数据吧。 你在处理设备归档表存储方案时对…...
Kerberos面试内容整理-在 Linux/Windows 中的 Kerberos 实践
Windows 实践: 在Windows环境中,Kerberos 几乎是无形融合的。用户使用域账号登录计算机时,实际上就完成了Kerberos的AS认证并获取TGT;此后的资源访问(如共享文件夹、打印机、数据库等)都会自动使用Kerberos进行验证,而无需用户干预。Windows通过LSASS进程维护和缓存用户…...
Java八股文——集合「Map篇」
Map 面试官您好,关于 Java 中常见的 Map 集合,我可以从非线程安全和线程安全两个方面来介绍: 首先,我们来看一下非线程安全的 Map 实现,这些在单线程环境下性能通常更好,但在并发场景下需要外部同步&…...
C++ if语句完全指南:从基础到工程实践
一、选择结构在程序设计中的核心地位 程序流程控制如同城市交通网络,if语句则是这个网络中的决策枢纽。根据ISO C标准,选择结构占典型项目代码量的32%-47%,其正确使用直接影响程序的: 逻辑正确性 执行效率 可维护性 安全边界 …...