如何将多文本框数据逐行插入数据库,实现序列号删除联动库存?
解决方案:多序列号批量插入与联动更新实现
完全可行,以下是具体实现步骤:
一、批量插入序列号到子表
针对3个序列号文本框,可通过集合遍历的方式统一处理插入,也可使用表值参数通过存储过程批量插入,两种方式示例如下:
方式1:遍历文本框逐个插入
// 先获取主表插入后的STOCKID(可通过存储过程输出参数或查询返回) string stockId = Textbox1.Text.Trim(); string model = Textbox2.Text.Trim(); // 将序列号文本框存入集合统一遍历 var serialTextBoxes = new List<TextBox> { Textbox4, Textbox5, Textbox6 }; foreach (var txtBox in serialTextBoxes) { string serial = txtBox.Text.Trim(); if (!string.IsNullOrEmpty(serial)) // 跳过空序列号 { // 调用存储过程或直接执行SQL插入子表 using (SqlCommand cmd = new SqlCommand("INSERT INTO SerialTable (STOCKID, MODEL, SERIAL) VALUES (@StockId, @Model, @Serial)", yourDbConnection)) { cmd.Parameters.AddWithValue("@StockId", stockId); cmd.Parameters.AddWithValue("@Model", model); cmd.Parameters.AddWithValue("@Serial", serial); cmd.ExecuteNonQuery(); } } }
方式2:表值参数批量插入(效率更高)
先在SQL中创建表值类型与对应存储过程:
-- 创建表值类型 CREATE TYPE SerialList AS TABLE (SERIAL NVARCHAR(50)) GO -- 批量插入存储过程 CREATE PROCEDURE InsertSerialBatch @StockId NVARCHAR(50), @Model NVARCHAR(50), @Serials SerialList READONLY AS BEGIN INSERT INTO SerialTable (STOCKID, MODEL, SERIAL) SELECT @StockId, @Model, SERIAL FROM @Serials END GO
再在C#中调用存储过程:
string stockId = Textbox1.Text.Trim(); string model = Textbox2.Text.Trim(); // 构建序列号数据表 DataTable serialTable = new DataTable(); serialTable.Columns.Add("SERIAL", typeof(string)); var serialTextBoxes = new List<TextBox> { Textbox4, Textbox5, Textbox6 }; foreach (var txtBox in serialTextBoxes) { string serial = txtBox.Text.Trim(); if (!string.IsNullOrEmpty(serial)) { serialTable.Rows.Add(serial); } } // 执行批量插入 using (SqlCommand cmd = new SqlCommand("InsertSerialBatch", yourDbConnection)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@StockId", stockId); cmd.Parameters.AddWithValue("@Model", model); cmd.Parameters.Add(new SqlParameter("@Serials", SqlDbType.Structured) { Value = serialTable, TypeName = "SerialList" }); cmd.ExecuteNonQuery(); }
二、GridView绑定与删除联动
1. 绑定两个GridView
- 第一个GridView绑定主表数据:直接查询
StockTable的STOCKID、MODEL、QUANTITY字段。 - 第二个GridView绑定子表数据,添加删除按钮:通过
TemplateField添加Button控件,设置CommandName="Delete",CommandArgument绑定子表主键或序列号。
2. 删除时联动更新主表数量
在第二个GridView的RowDeleting事件中处理逻辑:
protected void SerialGridView_RowDeleting(object sender, GridViewDeleteEventArgs e) { string serial = e.Values["SERIAL"].ToString(); string stockId = e.Values["STOCKID"].ToString(); // 1. 删除子表中的目标序列号 using (SqlCommand cmd = new SqlCommand("DELETE FROM SerialTable WHERE SERIAL = @Serial", yourDbConnection)) { cmd.Parameters.AddWithValue("@Serial", serial); cmd.ExecuteNonQuery(); } // 2. 递减主表对应记录的QUANTITY using (SqlCommand cmd = new SqlCommand("UPDATE StockTable SET QUANTITY = QUANTITY - 1 WHERE STOCKID = @StockId", yourDbConnection)) { cmd.Parameters.AddWithValue("@StockId", stockId); cmd.ExecuteNonQuery(); } // 3. 重新绑定两个GridView刷新数据 BindStockGridView(); BindSerialGridView(); }
三、关键注意事项
- 事务处理:插入主表与子表时需用
SqlTransaction包裹,确保数据一致性(要么全成功,要么全回滚)。 - 序列号去重:插入前可检查子表是否已存在该序列号,避免重复数据。
- 空值过滤:遍历文本框时跳过空值,避免插入无效数据。
内容的提问来源于stack exchange,提问作者hasan25x
相关产品推荐
相关产品推荐

