C# WinForms实现学生信息CRUD与数据库交互

Oliver
Oliver
发布时间:2026-10-16 | 7人浏览过
原创

在C# Windows Forms开发中,实现学生信息的增删改查(CRUD)需要结合ADO.NET组件与SqlClient库。本文详细解析如何通过SqlConnection建立连接,利用SqlCommand执行参数化SQL语句以避免注入风险,并结合DataGridView实现数据的动态展示、条件筛选、行选择回显及刷新,提供完整的后端逻辑代码参考。

核心功能目标

本示例旨在构建一个基于WinForms的学生管理模块,具备以下能力:

  • 添加:校验唯一ID后插入新记录。
  • 查询:支持多字段组合的动态条件搜索,并实时绑定至表格控件。
  • 修改:根据选中的ID更新其他属性。
  • 删除:按ID移除指定学生档案。
  • 交互:点击表格行自动填充文本框,方便编辑或查看。

准备条件与环境配置

为确保代码正常运行,需满足以下条件:

  1. 数据库:已创建SQL Server数据库,包含名为Students的数据表,字段涵盖name, sex, college, id, grade, phone, email, qq, room。
  2. 项目引用:引入System.Data.SqlClient命名空间以访问SQL Server数据源。
  3. 窗体控件:在Form1上布置对应的TextBox(如txtname, txtid等)、Button(ButAdd, BtnSelect等)及DataGridView(dataGridView1)。

首先定义全局数据库连接字符串,便于复用:

private string str = "data source=本地IP;initial catalog=数据库名;user ID=用户名;pwd=密码";

第1步:实现学生信息添加逻辑

添加操作需先验证ID唯一性,再执行插入。使用参数化查询是防止SQL注入的最佳实践。

目的与入口

用户填写完所有字段后,点击ButAdd按钮触发事件。

关键操作

  1. 连接检查:实例化SqlConnection并打开连接。
  2. 唯一性校验:调用自定义方法Existence(string id, SqlConnection conn)检查该ID是否已存在。若存在则返回提示;若不存在则继续。
  3. 参数构建:将各文本框内容封装为SqlParameter[]数组,对应存储过程或SQL指令的参数(如@name, @id)。
  4. 执行插入:执行INSERT INTO Students VALUES(...),并通过ExecuteNonQuery()获取受影响行数。若结果大于0,提示成功并刷新界面。

完成状态

弹出“添加成功”消息框,且界面上立即显示新增的学生记录。

第2步:实现动态查询功能

查询功能允许用户输入任意非空字段进行筛选,需动态拼接SQL WHERE子句。

目的与入口

用户在部分字段输入内容,点击BtnSelect按钮。

关键操作

  1. 基础语句:初始化StringBuilder,追加基础查询:select ... from Students where 1=1。
  2. 动态拼接:遍历各个文本框,若值不为空,则追加and 字段名 = '值'到SQL语句中。
  3. 数据填充:使用SqlDataAdapter执行生成的SQL,填充DataSet,并将ds.Tables[0]赋值给dataGridView1.DataSource。

注意

虽然此处演示了简单的字符串拼接查询,但在生产环境中,对于复杂查询建议同样使用参数化查询(SqlParameter)以确保安全性,避免因特殊字符导致错误或注入风险。

完成状态

dataGridView1更新为仅包含符合条件学生的数据列表。

第3步:实现选中行回显与数据修改

为了提升用户体验,点击表格中的任意一行,应将该行数据回填至对应的文本框,以便修改。

目的与入口

用户点击dataGridView1中的某一行,触发CellClick事件。

关键操作

通过SelectedRows[0].Cells["列名"].Value.ToString()获取选定行的各列值,并赋值给相应的TextBox(如txtname.Text等)。

随后,点击修改按钮时,执行UPDATE语句,使用相同的参数化方式提交更新,并根据ID定位记录。成功后调用刷新方法重新加载表格数据。

第4步:实现删除与数据刷新

删除操作需谨慎,通常需确认当前选中的ID。

目的与入口

用户确定要删除某条记录,点击BtnDelete。

关键操作

  1. 构造DELETE FROM Students WHERE id = @id语句,推荐使用参数化而非直接拼接。string.Format在此处虽可行,但需注意@id作为参数传递更规范。
  2. 执行ExecuteNonQuery,若返回行数>0,提示“删除成功”。
  3. 立即调用刷新数据的方法(如Form1_Load_1),清空界面并重新拉取全量数据。

代码结构完整示例

以下是整合上述逻辑的核心类代码结构。请注意替换其中的占位符与实际业务需求对齐。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace text3_CRUD
{
    public partial class Form1 : Form
    {
        // 请在此处替换为实际的连接字符串
        private string str = "data source=.;initial catalog=StudentDB;user ID=sa;pwd=yourpassword";

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 检查ID是否存在:存在返回false,不存在返回true
        /// </summary>
        public bool Existence(string id, SqlConnection conn)
        {
            string txtStr = $"select id from Students where id = '{id}'";
            SqlDataAdapter sda = new SqlDataAdapter(txtStr, conn);
            DataSet ds = new DataSet();
            sda.Fill(ds);
            if (ds.Tables[0].Rows.Count > 0)
                return false;
            return true;
        }

        /// <summary>
        /// 添加学生信息
        /// </summary>
        private void ButAdd_Click(object sender, EventArgs e)
        {
            string name = txtname.Text;
            string id = txtid.Text;
            // 假设其他字段类似获取...
            
            using (var conn = new SqlConnection(str))
            {
                conn.Open();
                
                // 检查是否存在
                if (Existence(id, conn))
                {
                    SqlParameter[] para = new SqlParameter[]
                    {
                        new SqlParameter("@name", name),
                        new SqlParameter("@id", id),
                        // 补充其他参数...
                    };

                    string sql = "insert into Students (name, id /*...*/) values(@name, @id /*...*/)";
                    SqlCommand com = new SqlCommand(sql, conn);
                    com.Parameters.AddRange(para);
                    
                    int result = (int)com.ExecuteNonQuery();
                    if (result > 0)
                    {
                        MessageBox.Show("添加成功!");
                        RefreshGrid();
                    }
                    else
                    {
                        MessageBox.Show("添加失败!");
                    }
                }
                else
                {
                    MessageBox.Show("数据已经存在!");
                }
            }
        }

        /// <summary>
        /// 动态查询
        /// </summary>
        private void BtnSelect_Click(object sender, EventArgs e)
        {
            string name = txtname.Text;
            string id = txtid.Text;
            // 获取其他字段...

            using (var conn = new SqlConnection(str))
            {
                conn.Open();
                StringBuilder sb = new StringBuilder();
                sb.Append("select * from Students where 1=1");

                if (!string.IsNullOrEmpty(name))
                    sb.AppendFormat(" and name = '{0}'", name);
                if (!string.IsNullOrEmpty(id))
                    sb.AppendFormat(" and id = '{0}'", id);
                // 补充其他条件...

                string sql = sb.ToString();
                SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
                DataSet ds = new DataSet();
                adapter.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0];
            }
        }

        /// <summary>
        /// 刷新DataGridView数据
        /// </summary>
        private void RefreshGrid()
        {
            using (var conn = new SqlConnection(str))
            {
                conn.Open();
                string sql = "select * from Students";
                SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
                DataSet ds = new DataSet();
                sda.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0];
            }
        }

        /// <summary>
        /// 选中行回显到文本框
        /// </summary>
        private void DataGridView1_CellClick_1(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                try
                {
                    var row = dataGridView1.SelectedRows[0];
                    txtname.Text = row.Cells["name"].Value?.ToString() ?? "";
                    txtid.Text = row.Cells["id"].Value?.ToString() ?? "";
                    // 回显其他字段...
                }
                catch { }
            }
        }

        /// <summary>
        /// 删除数据
        /// </summary>
        private void BtnDelete_Click(object sender, EventArgs e)
        {
            string id = txtid.Text;
            if (string.IsNullOrEmpty(id))
            {
                MessageBox.Show("请先选中要删除的记录");
                return;
            }

            using (var conn = new SqlConnection(str))
            {
                conn.Open();
                // 使用参数化更安全
                string sql = "delete from Students where id = @id";
                SqlCommand com = new SqlCommand(sql, conn);
                com.Parameters.AddWithValue("@id", id);
                
                int result = (int)com.ExecuteNonQuery();
                if (result > 0)
                {
                    MessageBox.Show("删除成功!");
                    RefreshGrid();
                    ClearTextboxes();
                }
            }
        }

        /// <summary>
        /// 清空文本框
        /// </summary>
        private void BtnClear_Click(object sender, EventArgs e)
        {
            ClearTextboxes();
        }

        private void ClearTextboxes()
        {
            txtname.Clear();
            txtid.Clear();
            // 清空其他...
        }
    }
}

以上是关于C# WinForms实现学生模块增删改查的详细实现步骤。通过合理运用参数化查询和UI控件的事件驱动机制,可以构建出稳定且易用的桌面端管理工具。更多关于C#数据库编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表