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

发布于:2025-04-06 ⋅ 阅读:(14) ⋅ 点赞:(0)

引言

        今天尝试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 @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),删除按钮

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

完成。