C# (图文教学)在C#的编译工具Visual Studio中使用SQLServer并对数据库中的表进行简单的增删改查--14

news2025/1/16 15:59:33

目录

一.安装SQLServer

二.在SQLServer中创建一个数据库

1.打开SQL Server  Manager Studio(SSMS)连接服务器

2.创建新的数据库

3.创建表

三.Visual Studio 配置

1.创建一个简单的VS项目(本文创建为一个简单的控制台项目)

2.添加数据库连接

 四.简单连通代码示例

简单连通代码示例:

五.在VS中对SQLServer中的Students表进行简单的增删改查


 

引言:

SQL Server是微软开发的关系数据库管理系统,与市面上其他数据库系统相比

SQL Server在企业级功能,性能优化,安全性和集成性方面表现优异,适合大中型企业应用

SQLServer的主要功能:

  1. 数据存储和管理:支持各种数据类型,包括结构化数据,非结构化数据和半结构化数据
  2. 安全性:提供了多层次的安全机制,如数据库加密,用户权限管理和审计功能
  3. 高可用性和灾难恢复:支持数据库镜像,日志传送,故障转移群集和Always On可用性组
  4. 性能优化:内置性能监控和优化工具,如索引调优,查询优化器和数据库引擎自动调优
  5. 集成服务:包括SQL Server Integration Services (SSIS),SQL Server Reporting Services (SSRS) 和SQL Server Analysis Services (SSAS),用于数据集成,报表生成和数据分析

一.安装SQLServer

当我们需要在Visual Studio中连接一个SQLServer数据库或者其他数据库时,我们需要先去其官网下载对应的数据库

Visual Studio(VS)是一个集成开发环境(IDE),支持多种编程语言和开发工具

借助Visual Studio,开发者可以方便的管理和操作SQLServer数据库

二.在SQLServer中创建一个数据库

1.打开SQL Server  Manager Studio(SSMS)连接服务器

可以将服务器名称替换为.(代表本机)

使用Windows身份验证

然后点击连接

2.创建新的数据库

在左侧对象资源管理器中右击"数据库"

选择"新建数据库"

输入数据库名称,点击确定

这里使用StudentDB作为数据库库名

3.创建表

展开数据库

选中当前数据库

选择"新建查询"(快捷键Ctrl+N)

添加以下列:

CREATE TABLE Students
(
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Name NVARCHAR(50),
    Age INT,
    Grade NVARCHAR(10)
)

执行SQL语句

然后右键"表",单击刷新,即可在"表"文件夹下找到新建表Students

右键Students表,单击设计,即可查看当前创建的表结构

三.Visual Studio 配置

1.创建一个简单的VS项目(本文创建为一个简单的控制台项目)

2.添加数据库连接

在"服务器资源管理器"中(视图->服务器资源管理器),快捷键Ctrl+Alt+S

右键"数据连接",点击添加连接

数据源选择SQLServer

服务器名自动检索

勾选"信任服务器证书"

数据库名选择新建的StudentDB

单击左下角"测试连接"

最后点击"确定"

打开解决方案资源管理器(快捷键为Ctrl+Alt+L)

右键"依赖项"

打开"管理NuGet程序包"

在"浏览"块 搜索SqlClient

单击Microsoft.Data.SqlClient 进行NuGet包的安装

安装时跳出接受许可证界面选择"我接受"

 四.简单连通代码示例

在上面的配置完成之后就可以在VS中使用SQLServer了

简单连通代码示例:

// 1. 连接字符串
string connectionString = "Server=.;Database=StudentDB;Trusted_Connection=True;TrustServerCertificate=True;";

try
{
    // 2. 创建连接对象
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        // 3. 打开连接,在using语句块中会自动关闭连接
        connection.Open();
        
        // 4. 创建命令对象
        string sql = "SELECT * FROM Students";
        SqlCommand cmd = new SqlCommand(sql, connection);
        
        // 5. 执行查询并读取数据
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                // 假设Students表有id、name和age字段
                Console.WriteLine($"ID: {reader["id"]}, 姓名: {reader["name"]}, 年龄: {reader["age"]},年级: {reader["grade"]}" );
            }
        }
    }
}
catch (Exception ex)
{
    Console.WriteLine($"发生错误: {ex.Message}");
}
Console.WriteLine("按任意键退出...");
Console.ReadKey();

代码解释:

string connectionString = "Server=.;Database=StudentDB;Trusted_Connection=True;TrustServerCertificate=True;";
  • 作用:定义用于连接数据库的连接字符串
  • 参数说明
    • Server=.:指定数据库服务器为本地服务器(.表示本地)
    • Database=StudentDB:指定要连接的数据库名称为StudentDB
    • Trusted_Connection=True:使用Windows身份验证方式连接数据库,而不是使用SQL Server身份验证
    • TrustServerCertificate=True:允许信任服务器证书,适用于使用自签名证书的情况,避免SSL证书错误
try   
{
    // 数据库操作代码   
}   
catch (Exception ex)   
{
    Console.WriteLine($"发生错误: {ex.Message}");
}
  • 作用:创建一个SqlConnection对象,用于与数据库建立连接
  • using语句:确保在using块结束时自动调用connection.Dispose()方法释放数据库连接资源,即自动关闭连接
  • 参数:传入之前定义的connectionString
connection.Open();
  • 作用:使用Open()方法与数据库建立实际的连接.此时,程序可以与数据库进行通信
string sql = "SELECT * FROM Students";   
SqlCommand cmd = new SqlCommand(sql, connection);
  • 作用
    • 定义要执行的SQL查询语句,这里是选择Students表中的所有记录
    • 创建一个SqlCommand对象,表示要对数据库执行的命令
  • 参数
    • sql:SQL查询字符串。
    • connection:之前创建并打开的数据库连接对象
using (SqlDataReader reader = cmd.ExecuteReader())   
{
    while (reader.Read())
    {
        // 读取数据并处理
    }
}
  • 作用
    • 调用ExecuteReader()方法执行SQL查询,返回一个SqlDataReader对象,用于读取查询结果
    • 使用 while (reader.Read())循环遍历结果集的每一行数据
  • using语句:确保reader对象在使用完毕后自动关闭并释放资源
Console.WriteLine($"ID: {reader["id"]}, 姓名: {reader["name"]}, 年龄: {reader["age"]},年级: {reader["grade"]}" );
  • 作用:如果在try块中的任何位置发生异常,程序会捕获该异常
  • 处理方式:输出错误信息ex.Message,以便了解错误的原因

五.在VS中对SQLServer中的Students表进行简单的增删改查

using Microsoft.Data.SqlClient;

namespace StudentDemo
{
    internal class Program
    {
        static string connectionString = "Server=.;Database=StudentDB;Trusted_Connection=True;TrustServerCertificate=True;";

        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("\n请选择操作:");
                Console.WriteLine("1. 查看所有学生");
                Console.WriteLine("2. 添加学生");
                Console.WriteLine("3. 修改学生");
                Console.WriteLine("4. 删除学生");
                Console.WriteLine("5. 退出");

                string choice = Console.ReadLine();
                
                switch (choice)
                {
                    case "1":
                        QueryAllStudents();
                        break;
                    case "2":
                        AddStudent();
                        break;
                    case "3":
                        UpdateStudent();
                        break;
                    case "4":
                        DeleteStudent();
                        break;
                    case "5":
                        return;
                    default:
                        Console.WriteLine("无效的选择!");
                        break;
                }
            }
        }

        static void QueryAllStudents()
        {
            try
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    string sql = "SELECT * FROM Students";
                    using (SqlCommand cmd = new SqlCommand(sql, connection))
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine($"ID: {reader["Id"]}, 姓名: {reader["Name"]}, 年龄: {reader["Age"]}, 年级: {reader["Grade"]}");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"查询出错: {ex.Message}");
            }
        }

        static void AddStudent()
        {
            try
            {
                Console.Write("请输入姓名:");
                string name = Console.ReadLine();
                Console.Write("请输入年龄:");
                int age = int.Parse(Console.ReadLine());
                Console.Write("请输入年级:");
                string grade = Console.ReadLine();

                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    string sql = "INSERT INTO Students (Name, Age, Grade) VALUES (@Name, @Age, @Grade)";
                    using (SqlCommand cmd = new SqlCommand(sql, connection))
                    {
                        cmd.Parameters.AddWithValue("@Name", name);
                        cmd.Parameters.AddWithValue("@Age", age);
                        cmd.Parameters.AddWithValue("@Grade", grade);
                        int result = cmd.ExecuteNonQuery();
                        Console.WriteLine($"成功添加 {result} 条记录");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"添加出错: {ex.Message}");
            }
        }

        static void UpdateStudent()
        {
            try
            {
                Console.Write("请输入要修改的学生ID:");
                int id = int.Parse(Console.ReadLine());
                Console.Write("请输入新的姓名(直接回车表示不修改):");
                string name = Console.ReadLine();
                Console.Write("请输入新的年龄(直接回车表示不修改):");
                string ageInput = Console.ReadLine();
                Console.Write("请输入新的年级(直接回车表示不修改):");
                string grade = Console.ReadLine();

                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    string sql = "UPDATE Students SET ";
                    List<string> updates = new List<string>();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = connection;

                    if (!string.IsNullOrWhiteSpace(name))
                    {
                        updates.Add("Name = @Name");
                        cmd.Parameters.AddWithValue("@Name", name);
                    }
                    if (!string.IsNullOrWhiteSpace(ageInput))
                    {
                        updates.Add("Age = @Age");
                        cmd.Parameters.AddWithValue("@Age", int.Parse(ageInput));
                    }
                    if (!string.IsNullOrWhiteSpace(grade))
                    {
                        updates.Add("Grade = @Grade");
                        cmd.Parameters.AddWithValue("@Grade", grade);
                    }

                    if (updates.Count > 0)
                    {
                        sql += string.Join(", ", updates);
                        sql += " WHERE Id = @Id";
                        cmd.Parameters.AddWithValue("@Id", id);
                        cmd.CommandText = sql;
                        int result = cmd.ExecuteNonQuery();
                        Console.WriteLine($"成功更新 {result} 条记录");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"修改出错: {ex.Message}");
            }
        }

        static void DeleteStudent()
        {
            try
            {
                Console.Write("请输入要删除的学生ID:");
                int id = int.Parse(Console.ReadLine());

                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    string sql = "DELETE FROM Students WHERE Id = @Id";
                    using (SqlCommand cmd = new SqlCommand(sql, connection))
                    {
                        cmd.Parameters.AddWithValue("@Id", id);
                        int result = cmd.ExecuteNonQuery();
                        Console.WriteLine($"成功删除 {result} 条记录");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"删除出错: {ex.Message}");
            }
        }
    }
}

以上代码实现了四个主要功能:

  • QueryAllStudents(): 查询并显示所有学生信息
  • AddStudent(): 添加新学生
  • UpdateStudent(): 根据ID更新学生信息
  • DeleteStudent(): 根据ID删除学生

每个方法都包含了错误处理

  • 使用参数化查询来防止SQL注入
  • 在更新操作中,支持只更新用户输入的字段

运行程序后,会显示一个菜单

  • 输入对应的数字(1-5)来执行相应的操作
  • 根据提示输入相应的信息
  • 程序会显示操作结果
  • 输入5可以退出程序

 

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

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

相关文章

Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)

Flutter插件在开发Flutter项目的过程中扮演着重要的角色&#xff0c;我们从 ​​​​​​https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的&#xff0c;这些第三方工具极大的提高了开发效率。 深入的了解插件的制作、发布、工作原理和缓存机…

自动化办公|xlwings简介

xlwings 是一个开源的 Python 库&#xff0c;旨在实现 Python 与 Microsoft Excel 的无缝集成。它允许用户使用 Python 脚本自动化 Excel 操作&#xff0c;读取和写入数据&#xff0c;执行宏&#xff0c;甚至调用 VBA 脚本。这使得数据分析、报告生成和其他与 Excel 相关的任务…

Dify应用-工作流

目录 DIFY 工作流参考 DIFY 工作流 2025-1-15 老规矩感谢参考文章的作者,避免走弯路。 2025-1-15 方便容易上手 在dify的一个桌面上,添加多个节点来完成一个任务。 每个工作流必须有一个开始和结束节点。 节点之间用线连接即可。 每个节点可以有输入和输出 输出类型有,字符串,…

《C++11》并发库:简介与应用

在C11之前&#xff0c;C并没有提供原生的并发支持。开发者通常需要依赖于操作系统的API&#xff08;如Windows的CreateThread或POSIX的pthread_create&#xff09;或者第三方库&#xff08;如Boost.Thread&#xff09;来创建和管理线程。这些方式存在以下几个问题&#xff1a; …

建筑综合布线可视化管理

随着数字化转型的加速&#xff0c;越来越多的业务应用依赖网络来实现&#xff0c;综合布线系统作为网络基础设施&#xff0c;加强对综合布线系统的管理维护是业务安全稳定运行的重要保障。传统的表格CAD图纸的综合布线管理模式&#xff0c;易造成综合布线系统线缆混乱、随意变更…

ESXi 切换硬盘直通后无法恢复的解决办法

起因&#xff1a;近日&#xff0c;准备了一块SATA固态硬盘&#xff0c;计划对现有的ESXI虚拟机上新增扩容。因为只增加一块固态&#xff0c;也不打算做raid&#xff0c;就打算把它当作单独的存储来用。在网上搜了一些方法&#xff0c;脑子一热&#xff0c;通过ESXI控制台程序&a…

计算机网络 (43)万维网WWW

前言 万维网&#xff08;World Wide Web&#xff0c;WWW&#xff09;是Internet上集文本、声音、动画、视频等多种媒体信息于一身的信息服务系统。 一、基本概念与组成 定义&#xff1a;万维网是一个分布式、联机式的信息存储空间&#xff0c;通过超文本链接的方式将分散的信息…

汽车免拆诊断案例 | 2007 款法拉利 599 GTB 车发动机故障灯异常点亮

故障现象  一辆2007款法拉利599 GTB车&#xff0c;搭载6.0 L V12自然吸气发动机&#xff08;图1&#xff09;&#xff0c;累计行驶里程约为6万km。该车因发动机故障灯异常点亮进厂检修。 图1 发动机的布置 故障诊断 接车后试车&#xff0c;发动机怠速轻微抖动&#xff0c;…

ChatGPT正在朝着全面个人助手迈出重要一步,推出了一个名为“Tasks”的新功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

微软震撼发布:Phi-4语言模型登陆Hugging Face

近日&#xff0c;微软公司在Hugging Face平台上正式发布了其最新的语言模型Phi-4&#xff0c;这一发布标志着人工智能技术的又一重要进步。Phi-4模型以其140亿参数的高效配置&#xff0c;在复杂推理任务中表现出色&#xff0c;特别是在数学领域&#xff0c;更是展现出了卓越的能…

RTC(Real_Time Clock)

RTC概述&#xff1a; RTC&#xff08;实时时钟&#xff0c;Real-Time Clock&#xff09;是一种用于跟踪当前日期和时间的计时设备。RTC可以是独立的芯片&#xff0c;也可以是集成在微控制器或处理器中的一个模块。RTC是现代电子设备中不可或缺的一部分&#xff0c;为各种应用提…

[leetcode]链表基础回顾

一.创建带头节点的链表 #include <iostream> #include <string> #include <algorithm> using namespace std; typedef struct Node { char ch; Node* next; }*LinkList,ListNode; void printLinkList(LinkList& head) { LinkList p head…

rclone,云存储备份和迁移的瑞士军刀,千字常文解析,附下载链接和安装操作步骤...

一、什么是rclone&#xff1f; rclone是一个命令行程序&#xff0c;全称&#xff1a;rsync for cloud storage。是用于将文件和目录同步到云存储提供商的工具。因其支持多种云存储服务的备份&#xff0c;如Google Drive、Amazon S3、Dropbox、Backblaze B2、One Drive、Swift、…

JAVA:利用 RabbitMQ 死信队列实现支付超时场景的技术指南

1、简述 在支付系统中&#xff0c;订单支付的超时自动撤销是一个非常常见的业务场景。通常用户未在规定时间内完成支付&#xff0c;系统会自动取消订单&#xff0c;释放相应的资源。本文将通过利用 RabbitMQ 的 死信队列&#xff08;Dead Letter Queue, DLQ&#xff09;来实现…

favor的本质

英文单词 favor&#xff0c;通常指一个的“喜好或偏爱”&#xff1a; favor n.赞成&#xff1b;喜爱&#xff0c;宠爱&#xff0c;好感&#xff0c;赞同&#xff1b;偏袒&#xff0c;偏爱&#xff1b;善行&#xff0c;恩惠 v.赞同&#xff1b;喜爱&#xff0c;偏爱&#xff1b…

[青基解读一] 2025年国家自然科学基金---指南解读

指南解读 1 需要2个高级专业技术职称推荐&#xff08;2个正教授&#xff09; 2 国自然、国社科只能申请一个 3 资助类别 亚类说明 附注说明 自由探索or目标导向 4 申请代码到二级 申请代码、研究方向、关键词 主要参与者不写学生仅写人数 主要参与者 在线采集、填写简历、生成…

Open FPV VTX开源之ardupilot配置

Open FPV VTX开源之ardupilot配置 1. 源由2. 配置3. 总结4. 参考资料5. 补充5.1 飞控固件版本5.2 配置Ardupilot的BF OSD5.3 OSD偏左问题 1. 源由 飞控嵌入式OSD - ardupilot配置使用ardupliot配套OSD图片。 Choose correct font depending on Flight Controller SW. ──>…

HarmonyOS应用开发者初级认证最新版– 2025/1/13号题库新版

1.欢迎各位读者&#xff0c;本文档来自鸿蒙开发学员亲测&#xff0c;最新版。&#xff08;考试时直接Ctrlf进行搜索&#xff0c;一定要认真比对答案&#xff0c;有的答案相似度很高&#xff09;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 欢迎…

视觉多模态大模型---MiniMax-vl-01---以闪电般的注意力缩放基础模型

简介 MiniMax-VL-01 是与今年1月15日由上海稀宇科技有限公司&#xff08;MiniMax&#xff09;发布并开源的一款视觉多模态大模型&#xff0c;它与基础语言大模型 MiniMax-Text-01 一同构成了 MiniMax-01 系列。这款模型的设计初衷是为了应对日益增长的长上下文处理需求&#x…

CF 230A.Dragons(Java实现)

题目分析 &#xff08;桐老爷&#xff0c;泪目&#xff09;题目讲很多字&#xff0c;其实就是打怪升级&#xff0c;初始战斗力>龙的战斗力就能击败龙并炼化经验增加战斗力&#xff0c;然后打下一条龙&#xff0c;如果打不过了就寄 思路分析 首先我还是想到键值对&#xff0…