ASP.NET中如何将GridView数据插入SQL Server签到签退关联表?
解决GridView行数据获取与签到签退表插入问题
看起来你在开发签到签退系统时,卡在了从GridView提取员工姓名并插入到关联表的环节。我来帮你梳理下正确的实现思路和代码,顺便修正你代码里的语法错误和潜在问题。
第一步:处理GridView行点击,存储员工姓名信息
首先,我们需要在GridView的行点击事件里获取选中员工的lastName、firstName和middleName。推荐用SelectedIndexChanged事件,操作更直接:
// 用ViewState存储选中的员工信息,相比全局变量更适配Web场景的状态管理 protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { // 获取选中行 GridViewRow selectedRow = GridView1.SelectedRow; // 优先通过DataKeyNames获取数据(更可靠,不受列顺序影响) // 前提是你在GridView的DataKeyNames属性中设置了lastName,firstName,middleName ViewState["SelectedLastName"] = GridView1.SelectedDataKey["lastName"].ToString(); ViewState["SelectedFirstName"] = GridView1.SelectedDataKey["firstName"].ToString(); ViewState["SelectedMiddleName"] = GridView1.SelectedDataKey["middleName"]?.ToString() ?? ""; // 如果没设置DataKeyNames,也可以通过列索引获取(注意列索引从0开始) // ViewState["SelectedLastName"] = selectedRow.Cells[1].Text; // ViewState["SelectedFirstName"] = selectedRow.Cells[2].Text; // ViewState["SelectedMiddleName"] = selectedRow.Cells[3].Text; }
第二步:按钮点击执行插入操作
接下来是核心的插入逻辑,这里要修正你原来的SqlConnection语法错误,同时注意资源管理和安全问题:
protected void btnSignOperation_Click(object sender, EventArgs e) { // 先判断是否选中了员工 if (ViewState["SelectedLastName"] == null) { ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('请先选择一位员工!');", true); return; } // 拼接员工姓名:Lname + Fname + Mname,处理中间名可能为空的情况 string lastName = ViewState["SelectedLastName"].ToString(); string firstName = ViewState["SelectedFirstName"].ToString(); string middleName = ViewState["SelectedMiddleName"].ToString(); string employeeName = $"{lastName}{firstName}{middleName}"; // 获取数据库连接字符串(替换成你配置文件里的连接字符串名称) string connectionString = ConfigurationManager.ConnectionStrings["YourConnStringName"].ConnectionString; // 使用using语句自动释放数据库连接资源,避免连接池耗尽 using (SqlConnection con = new SqlConnection(connectionString)) { // 插入SQL语句,用参数占位符防止SQL注入 string insertSql = @"INSERT INTO 签到签退表(Employee_name, Sign_Time, Sign_Type) VALUES (@EmpName, GETDATE(), @SignType)"; // 这里的表字段名请根据你的实际表结构调整 using (SqlCommand cmd = new SqlCommand(insertSql, con)) { // 添加参数,避免SQL注入风险 cmd.Parameters.AddWithValue("@EmpName", employeeName); cmd.Parameters.AddWithValue("@SignType", sender is Button btn ? btn.Text : "签到"); // 动态判断是签到还是签退 try { con.Open(); int affectedRows = cmd.ExecuteNonQuery(); if (affectedRows > 0) { ClientScript.RegisterStartupScript(this.GetType(), "success", "alert('操作成功!');", true); // 清空选中状态,提升用户体验 GridView1.SelectedIndex = -1; ViewState.Remove("SelectedLastName"); ViewState.Remove("SelectedFirstName"); ViewState.Remove("SelectedMiddleName"); } else { ClientScript.RegisterStartupScript(this.GetType(), "error", "alert('操作失败,请重试!');", true); } } catch (Exception ex) { // 生产环境建议将异常写入日志,这里仅做前端提示 ClientScript.RegisterStartupScript(this.GetType(), "error", $"alert('出错了:{ex.Message}');", true); } } } }
关键注意事项
- DataKeyNames的使用:强烈建议在GridView的
DataKeyNames属性中配置lastName,firstName,middleName,这样通过SelectedDataKey获取数据不会因为列顺序调整而出错。 - SQL注入防护:绝对不要直接拼接字符串到SQL语句中,参数化查询是Web开发的安全基础。
- 空值处理:考虑到
middleName可能为空的场景,拼接时用空值合并运算符处理,避免出现多余的空字符串。 - 资源管理:
using语句会自动帮你关闭数据库连接,避免因忘记关闭连接导致的连接池耗尽问题。
内容的提问来源于stack exchange,提问作者geebee
相关产品推荐
相关产品推荐

