You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多文本框数据逐行插入数据库,实现序列号删除联动库存?

解决方案:多序列号批量插入与联动更新实现

完全可行,以下是具体实现步骤:

一、批量插入序列号到子表

针对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:45:32