2-Visual Studio 2022 NET开发Windows桌面软件并连接SQL Server数据库

引言

        今天尝试Visual Studio 2022 NET开发一个NET桌面软件,并尝试连接SQL Server的数据库,此文章为开发笔记。

---------------------------------------------------------------------------------------------------------------------------------

一,创建项目

1,VS配置项目基础环境

创建新项目

2,创建Git仓库

访问>>>>Gitee<<<<

创建仓库(建议创建开源仓库,以供大家学习参考)

复制这个链接

回到VS2022,点击Git更改,创建Git仓库

点保存

配置完成。

返回仓库:查看已经更新。

添加开源许可证为Apache2.0

提交即可:

完成

---------------------------------------------------------------------------------------------------------------------------------

二,设计窗体与数据源绑定

使用的组件有:Label,DataGridView

先添加Label文字组件,然后添加DataGridView数据组件

1,绑定数据源

选择添加数据源:

选择添加数据库:

        此处选择已经安装好的SQL Server 数据库,添加好数据,添加教程,并勾选显示将保存在应用程序中的连接字符串选项

Data Source=UNIX-OS;Initial Catalog=bigdata;Integrated Security=True;Encrypt=True;Trust Server Certificate=True

选择数据源

选择需要显示的表和字段

点完成

调整窗体设计:

选择启动,即可显示:

数据链接完成。

3,分割项目代码版本

ctrl+s保存当前工程,选择git更改

消息内容:绑定数据源

点击更改数右边的+号,全部添加,如有未保存的点击保存即可。

点击提交临时数据

点此上传图标

推送完成

---------------------------------------------------------------------------------------------------------------------------------

三,添加公共控件

此阶段将添加公共控件用于支持对数据表进行查询,删除,插入操作

 1,控件选择

Button单击它时引发事件  
TextBox输入文本

在视图的工具箱里选择Button和TextBox

选择Button控件,在它的属性里修改其显示文本Text修改为:查询

适当调节显示的字体属性Font参数

查看:

TextBox控件也可以通过修改字体大小调整整体的大小

2,控件功能设置

(1),查询按钮

双击进入Button查询控件,调整点击后引发的事件,编写对Button引发事件的代码

示例代码:

private void button1_Click(object sender, EventArgs e)
{// 检查输入有效性if (this.textBox1.Text == ""){// 弹出空输入提示MessageBox.Show("请输入查询内容!");}else{// 构建动态SQL查询语句(注意:存在SQL注入风险,建议使用参数化查询)// 使用LIKE进行模糊查询,%表示任意字符匹配string strsql = " SELECT * FROM table_name WHERE field_name LIKE '%" + textBox1.Text + "%' ";/* 创建数据库连接对象* 参数说明:* Data Source - 数据库服务器地址/实例名* Initial Catalog - 数据库名称* Integrated Security - 使用Windows身份验证* Encrypt - 启用加密连接* TrustServerCertificate - 信任服务器证书(开发环境常用) */SqlConnection conn = new SqlConnection("Data Source=UNIX-OS;Initial Catalog=bigdata;" + "Integrated Security=True;Encrypt=True;TrustServerCertificate=True");// 创建命令对象(关联SQL语句和数据库连接)SqlCommand cmd = new SqlCommand(strsql, conn);// 创建数据适配器(作为数据库与DataSet之间的桥梁)SqlDataAdapter da = new SqlDataAdapter(cmd);// 实例化DataSet(内存中的关系型数据容器)DataSet ds = new DataSet();try {// 打开数据库连接conn.Open();// 使用数据适配器填充DataSet// Fill方法会自动处理连接状态,如果连接未打开会自动打开da.Fill(ds);// 绑定数据到DataGridView// Tables[0] 表示DataSet中的第一个数据表dataGridView1.DataSource = ds.Tables[0];}catch (Exception ex){// 异常处理(建议记录日志或显示错误信息)MessageBox.Show("数据库操作失败: " + ex.Message);}finally{// 确保连接关闭(释放资源)if (conn.State != ConnectionState.Closed){conn.Close();}}}
}

需要修改的变量:3个

table_name表名
field_name查询字段
SqlConnection conn = new SqlConnection();SQL Server服务器连接信息,就是创建数据源时需要复制的连接字段

调整后:

代码建议:此示例代码可能有SQL注入的漏洞,仅用于开发环境使用,下提供修复后的完整代码:

private async void button1_Click(object sender, EventArgs e)
{// 输入验证if (string.IsNullOrWhiteSpace(textBox1.Text)){MessageBox.Show("请输入有效的会员卡号查询内容!", "输入提示", MessageBoxButtons.OK, MessageBoxIcon.Information);return;}try{// 使用参数化查询防止SQL注入const string query = @"SELECT * FROM huiyuan WHERE 会员卡号 LIKE @SearchTermORDER BY 会员卡号";// 使用配置文件中的连接字符串(推荐)var connectionString = "Data Source=UNIX-OS;Initial Catalog=bigdata;" +"Integrated Security=True;Encrypt=True;" +"TrustServerCertificate=True";// 使用using自动释放资源using (var conn = new SqlConnection(connectionString))using (var cmd = new SqlCommand(query, conn)){// 添加参数化查询cmd.Parameters.Add("@SearchTerm", SqlDbType.NVarChar, 50).Value = $"%{textBox1.Text.Trim()}%";// 异步操作防止界面冻结await conn.OpenAsync();var dataTable = new DataTable("Members");// 使用SqlDataReader提升性能using (var reader = await cmd.ExecuteReaderAsync()){dataTable.Load(reader);}// 显示结果if (dataTable.Rows.Count > 0){dataGridView1.DataSource = dataTable;dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells);}else{dataGridView1.DataSource = null;MessageBox.Show("未找到匹配的会员记录", "查询结果", MessageBoxButtons.OK, MessageBoxIcon.Warning);}}}catch (SqlException ex){MessageBox.Show($"数据库错误:{ex.Message}\n错误代码:{ex.Number}", "数据库异常", MessageBoxButtons.OK, MessageBoxIcon.Error);}catch (Exception ex){MessageBox.Show($"操作失败:{ex.Message}", "系统异常", MessageBoxButtons.OK, MessageBoxIcon.Error);}
}

尝试启动操作查询:

成功。开始进一步开发功能:

添加删除、插入、恢复显示的Button,只需要改一下代码的SQL语句即可。

(2),删除按钮

private async void button2_Click(object sender, EventArgs e)
{// 输入验证(删除操作需要更严格的验证)if (string.IsNullOrWhiteSpace(textBox1.Text)){MessageBox.Show("请输入有效的会员卡号!","输入提示",MessageBoxButtons.OK,MessageBoxIcon.Information);return;}try{// 修改后的删除SQL语句(使用精确匹配)const string deleteQuery = @"DELETE FROM huiyuan WHERE 会员卡号 = @CardNo";  // 移除了ORDER BY和模糊查询var connectionString = "Data Source=UNIX-OS;Initial Catalog=bigdata;" +"Integrated Security=True;Encrypt=True;" +"TrustServerCertificate=True";using (var conn = new SqlConnection(connectionString))using (var cmd = new SqlCommand(deleteQuery, conn)){// 修改参数名称和类型(根据实际字段类型调整)cmd.Parameters.Add("@CardNo", SqlDbType.NVarChar, 100).Value = textBox1.Text.Trim();await conn.OpenAsync();// 执行删除操作(返回受影响行数)int rowsAffected = await cmd.ExecuteNonQueryAsync();// 显示操作结果if (rowsAffected > 0){MessageBox.Show($"成功删除 {rowsAffected} 条会员记录","操作成功",MessageBoxButtons.OK,MessageBoxIcon.Information);// 可选:刷新数据视图// RefreshDataGridView(); }else{MessageBox.Show("未找到匹配的会员记录","删除结果",MessageBoxButtons.OK,MessageBoxIcon.Warning);}}}catch (SqlException ex){// 特别处理外键约束等错误string errorMsg = ex.Number == 547 ? "存在关联数据,无法直接删除!" : ex.Message;MessageBox.Show($"删除失败:{errorMsg}","数据库异常",MessageBoxButtons.OK,MessageBoxIcon.Error);}catch (Exception ex){MessageBox.Show($"操作失败:{ex.Message}","系统异常",MessageBoxButtons.OK,MessageBoxIcon.Error);}
}

测试:

删除成功!

(3),添加恢复显示/重置按钮

private async void button3_Click(object sender, EventArgs e)
{try{// 修改后的查询SQL语句const string query = @"SELECT * FROM huiyuan";  // 移除了WHERE条件和参数var connectionString = "Data Source=UNIX-OS;Initial Catalog=bigdata;" +"Integrated Security=True;Encrypt=True;" +"TrustServerCertificate=True";using (var conn = new SqlConnection(connectionString))using (var cmd = new SqlCommand(query, conn)){// 移除了参数添加代码(因为不需要查询条件)await conn.OpenAsync();var dataTable = new DataTable("Clients");// 恢复使用DataReader读取数据using (var reader = await cmd.ExecuteReaderAsync()){dataTable.Load(reader);}// 显示结果if (dataTable.Rows.Count > 0){dataGridView1.DataSource = dataTable;dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells);}else{dataGridView1.DataSource = null;MessageBox.Show("客户端表无数据","查询结果",MessageBoxButtons.OK,MessageBoxIcon.Warning);}}}catch (SqlException ex){MessageBox.Show($"数据库错误:{ex.Message}","数据库异常",MessageBoxButtons.OK,MessageBoxIcon.Error);}catch (Exception ex){MessageBox.Show($"操作失败:{ex.Message}","系统异常",MessageBoxButtons.OK,MessageBoxIcon.Error);}
}

测试:

先查询后再恢复:

成功!

---------------------------------------------------------------------------------------------------------------------------------

四,配置系统主界面

1,新建Windows窗体

选择项目,右键添加,Windows窗体

在视图里的工具箱里找到MenuStrip建立菜单栏

按需输入模块

我这里直接选则buttion控件操作。

完成。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kafka 漏消费和重复消费问题

Kafka 虽然是一个高可靠、高吞吐的消息系统&#xff0c;但如果使用不当&#xff0c;**“漏消费”和“重复消费”**问题是非常容易发生的&#xff0c;尤其在业务系统中会造成数据丢失、重复写库等严重问题。 &#x1f3af; 一句话理解&#xff1a; Kafka 本身提供 “至多一次”…

【大模型深度学习】如何估算大模型需要的显存

一、模型参数量 参数量的单位 参数量指的是模型中所有权重和偏置的数量总和。在大模型中&#xff0c;参数量的单位通常以“百万”&#xff08;M&#xff09;或“亿”&#xff08;B&#xff0c;也常说十亿&#xff09;来表示。 百万&#xff08;M&#xff09;&#xff1a;表示…

LeetCode算法题(Go语言实现)_32

题目 在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪生节点为第 (n-1-i) 个节点 。 比方说&#xff0c;n 4 那么节点 0 是节点 3 的孪生节点&#xff0c;节点 1 是…

Linux makefile的一些语法

一、定义变量 1. 变量的基本语法 在 makefile 中&#xff0c;变量的定义和使用非常类似于编程语言中的变量。变量的定义格式&#xff08;最好不要写空格&#xff09;如下&#xff1a; VARIABLE_NAMEvalue 或者 VARIABLE_NAME:value 表示延迟赋值&#xff0c;变量的值在引…

CAN/FD CAN总线配置 最新详解 包含理论+实战(附带源码)

看前须知&#xff1a;本篇文章不会说太多理论性的内容&#xff08;重点在理论结合实践&#xff09;&#xff0c;顾及实操&#xff0c;应用&#xff0c;一切理论内容支撑都是为了后续实际操作进行铺垫&#xff0c;重点在于读者可以看完文章应用。&#xff08;也为节约读者时间&a…

木马学习记录

一句话木马是什么 一句话木马就是仅需要一行代码的木马&#xff0c;很简短且简单&#xff0c;木马的函数将会执行我们发送的命令 如何发送命令&#xff06;发送的命令如何执行? 有三种方式&#xff1a;GET&#xff0c;POST&#xff0c;COOKIE&#xff0c;一句话木马中用$_G…

Linux系统调用编程

一、进程和线程的概念 1.进程 进程是指一个具有独立功能的程序在某个数据集上的一次动态执行过程,它是系统进行资源分配和调度的最小单元。 定义&#xff1a;进程是程序的一次执行实例&#xff0c;拥有独立的地址空间、资源&#xff08;如内存、文件描述符等&#xff09;和系…

PostgreSQL的扩展(extensions)-常用的扩展-pg_dirtyread

PostgreSQL的扩展&#xff08;extensions&#xff09;-常用的扩展-pg_dirtyread pg_dirtyread 是 PostgreSQL 的一个特殊扩展&#xff0c;它允许读取已被删除但尚未被 VACUUM 清理的数据行&#xff0c;是数据恢复的重要工具。 原理&#xff1a; pg_dirtyread 通过直接访问表的…

花卉识别分类系统,Python/resnet18/pytorch

花卉识别分类系统,Python/resnet18/pytorch 基于pytorch训练, resnet18网络&#xff0c;可用于训练其他分类问题&#xff0c;也可自己重新训练 共五种花卉&#xff1a;雏菊&#xff0c;蒲公英&#xff0c;玫瑰&#xff0c;向日葵&#xff0c;郁金香 标价包含GUI源码、数据集…

SQL Server数据库异常-[SqlException (0x80131904): 执行超时已过期] 操作超时问题及数据库日志已满的解决方案

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;获得2024年博客之星荣誉证书&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c…

C++数据排序( 附源码 )

一.冒泡排序 原理:自左向右依次遍历,若相邻两数顺序错误,则交换两数. 这样,每一轮结束后,最大/最小的数就会到最后. Code: #include <iostream> #include <cstdio> using namespace std; const int N1e51; int n,a[N],in; void PrintArray(int a[],int n){for…

MTK-GMS版本国内WIFI受限问题

MTK-GMS版本国内WIFI受限问题解决 文章目录 问题参考资料解决方案方案一 修改配置坑点 方案二 直接修改属性 问题 最近负责ROOM 产品&#xff0c;出现WIFI受限显示&#xff0c;但是网络是通畅的。 GMS 版本&#xff0c;在国外或者国内翻墙网络不会出现WIFI受限显示问题&#…