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 数据库,添加好数据,添加教程,并勾选显示将保存在应用程序中的连接字符串选项

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控件操作。

完成。

相关推荐
程序员Bears1 小时前
IntelliJ IDEA 2025系列通用软件安装教程(Windows版)
ide·windows·pycharm·webstorm
CHANG_THE_WORLD1 小时前
Windows DirectWrite接口 遍历字体信息
windows
只可远观1 小时前
Flutter Dart 集合类型List Set Map详解军 以及循环语句 forEaclh map where any every
windows·flutter·list
Databend1 小时前
大数据是不是凉了?
数据库
学也不会1 小时前
雪花算法
java·数据库·oracle
码农新猿类2 小时前
信号量函数
linux·c++·visual studio
瀚高PG实验室2 小时前
数据库未正常关闭后,再次启动时只有主进程,数据库日志无输出
数据库
LG.YDX3 小时前
MySQL:13.用户管理
数据库·mysql
simple_whu3 小时前
Visual Studio C/C++编译器cl.exe的/source-charset与/execution-charset设置项
c语言·c++·visual studio
晓柏3 小时前
常用数据库备份与恢复
数据库