C# WinForms实现学生信息CRUD与数据库交互
在C# Windows Forms开发中,实现学生信息的增删改查(CRUD)需要结合ADO.NET组件与SqlClient库。本文详细解析如何通过SqlConnection建立连接,利用SqlCommand执行参数化SQL语句以避免注入风险,并结合DataGridView实现数据的动态展示、条件筛选、行选择回显及刷新,提供完整的后端逻辑代码参考。
核心功能目标
本示例旨在构建一个基于WinForms的学生管理模块,具备以下能力:
- 添加:校验唯一ID后插入新记录。
- 查询:支持多字段组合的动态条件搜索,并实时绑定至表格控件。
- 修改:根据选中的ID更新其他属性。
- 删除:按ID移除指定学生档案。
- 交互:点击表格行自动填充文本框,方便编辑或查看。
准备条件与环境配置
为确保代码正常运行,需满足以下条件:
- 数据库:已创建SQL Server数据库,包含名为
Students的数据表,字段涵盖name,sex,college,id,grade,phone,email,qq,room。 - 项目引用:引入
System.Data.SqlClient命名空间以访问SQL Server数据源。 - 窗体控件:在Form1上布置对应的TextBox(如
txtname,txtid等)、Button(ButAdd,BtnSelect等)及DataGridView(dataGridView1)。
首先定义全局数据库连接字符串,便于复用:
private string str = "data source=本地IP;initial catalog=数据库名;user ID=用户名;pwd=密码";
第1步:实现学生信息添加逻辑
添加操作需先验证ID唯一性,再执行插入。使用参数化查询是防止SQL注入的最佳实践。
目的与入口
用户填写完所有字段后,点击ButAdd按钮触发事件。
关键操作
- 连接检查:实例化
SqlConnection并打开连接。 - 唯一性校验:调用自定义方法
Existence(string id, SqlConnection conn)检查该ID是否已存在。若存在则返回提示;若不存在则继续。 - 参数构建:将各文本框内容封装为
SqlParameter[]数组,对应存储过程或SQL指令的参数(如@name,@id)。 - 执行插入:执行
INSERT INTO Students VALUES(...),并通过ExecuteNonQuery()获取受影响行数。若结果大于0,提示成功并刷新界面。
完成状态
弹出“添加成功”消息框,且界面上立即显示新增的学生记录。
第2步:实现动态查询功能
查询功能允许用户输入任意非空字段进行筛选,需动态拼接SQL WHERE子句。
目的与入口
用户在部分字段输入内容,点击BtnSelect按钮。
关键操作
- 基础语句:初始化
StringBuilder,追加基础查询:select ... from Students where 1=1。 - 动态拼接:遍历各个文本框,若值不为空,则追加
and 字段名 = '值'到SQL语句中。 - 数据填充:使用
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。
关键操作
- 构造
DELETE FROM Students WHERE id = @id语句,推荐使用参数化而非直接拼接。string.Format在此处虽可行,但需注意@id作为参数传递更规范。 - 执行
ExecuteNonQuery,若返回行数>0,提示“删除成功”。 - 立即调用刷新数据的方法(如
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#数据库编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













