引言
今天尝试Visual Studio 2022 NET开发一个NET桌面软件,并尝试连接SQL Server的数据库,此文章为开发笔记。
一,创建项目
1,VS配置项目基础环境
创建新项目



2,创建Git仓库

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

复制这个链接

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


点保存

配置完成。

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

添加开源许可证为Apache2.0

提交即可:

完成

二,设计窗体与数据源绑定
使用的组件有:Label,DataGridView
先添加Label文字组件,然后添加DataGridView数据组件
1,绑定数据源

选择添加数据源:

选择添加数据库:


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

sql
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引发事件的代码

示例代码:
cs
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注入的漏洞,仅用于开发环境使用,下提供修复后的完整代码:
cs
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 @SearchTerm
ORDER 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),删除按钮
cs
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),添加恢复显示/重置按钮
cs
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控件操作。

完成。