c# - 使用 2 个存储过程更新现有记录并仅插入 Datagridview 的新记录

标签 c# sql-server stored-procedures datagridview

我想使用 2 个存储过程(插入、更新)同时更新现有记录并仅插入 DataGridView 的新记录。

但我不知道如何确定哪一行是新插入的行,哪一行是现有行。

如果该行存在,我想调用存储过程Update,否则我想调用Insert

这是两个过程:

alter PROCEDURE [dbo].[proc_TBL_PROC_PMS_Insert]
    @INDEXNO nvarchar(50),
    @_PROCESS_INST_NO nvarchar(50),
    @_Order_No nvarchar(50),
    @_GOODS_CD  nvarchar(50),
    @_GOODS_NAME nvarchar(50),
    @_LINE_NO       int,
    @_UNIT nvarchar(50),
    @_QTY int   
AS
    INSERT INTO [TBL_PROC_PMS]([INDEXNO],[_PROCESS_INST_NO],[_Order_No],[_LINE_NO],[_GOODS_CD],[_GOODS_NAME],[_UNIT],[_QTY])
    VALUES(@INDEXNO,@_PROCESS_INST_NO,@_Order_No,@_LINE_NO,@_GOODS_CD,@_GOODS_NAME,@_UNIT,@_QTY)

ALTER PROCEDURE [dbo].[proc_TBL_PROC_PMS_Update]
    @_PROCESS_INST_NO nvarchar(50),
    @_GOODS_CD  nvarchar(50),
    @_GOODS_NAME nvarchar(50),
    @_LINE_NO       int,
    @_UNIT nvarchar(50),
    @_QTY int       
AS
    UPDATE [ENVNDIVDB].[dbo].[TBL_PROC_PMS] SET _GOODS_CD=@_GOODS_CD,_GOODS_NAME=@_GOODS_NAME,  _UNIT = @_UNIT,_QTY=@_QTY                   
     WHERE _PROCESS_INST_NO=@_PROCESS_INST_NO AND  _LINE_NO = @_LINE_NO

这是按钮保存点击

var cmd2 = new SqlCommand("proc_TBL_PROC_PMS_Update", sqlConn);
cmd2.CommandType = CommandType.StoredProcedure;

foreach (DataGridViewRow item in grdMaterial.Rows)
{
    if (!item.IsNewRow)
    {
        cmd2.Parameters.Clear();
        int rowindex = item.Index;
        cmd2.Parameters.AddWithValue("@_PROCESS_INST_NO", txtInstNo.Text);

        cmd2.Parameters.AddWithValue("@_LINE_NO", rowindex);
        cmd2.Parameters.AddWithValue("@_GOODS_CD", item.Cells[4].Value);
        cmd2.Parameters.AddWithValue("@_GOODS_NAME", item.Cells[5].Value);
        cmd2.Parameters.AddWithValue("@_UNIT", item.Cells[6].Value);
        cmd2.Parameters.AddWithValue("@_QTY", item.Cells[7].Value);
        cmd2.ExecuteNonQuery();
    }
}

最佳答案

您应该有一个包含行 ID 的列(可以隐藏 - .visible = False),其中新插入的行将没有任何内容/DbNull(如果可见,请将此 ID 列设置为只读)。将它们插入数据库后,更新网格,这些行将有一个 ID。这样您就可以安全地识别现有行和新行。

关于c# - 使用 2 个存储过程更新现有记录并仅插入 Datagridview 的新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46558537/

相关文章:

c# - 无意代码第一异常 |使用数据库优先的 Effort.Ef6 Entity Framework 单元测试

SQL模拟自增字段

sql-server - Sql server 表可以查询但不能更新

sql-server - 更新后 SSMS 停止加载我的存储过程

sql-server - SQL Server:是否可以从CLR UDF内调用更新表的存储过程

c# - 如何使用 C# 获取或设置 localStorage 或 sessionStorage 存储?

c# - 如果类继承自 IDisposable(或任何),则接口(interface)从 IDisposable(或任何)继承是好的/必要的吗?

C# 使用 AutoResetEvent 等待来自另一个线程的输入

sql - "This SqlTransaction has completed; it is no longer usable."...配置错误?

php - 如何在for循环中调用存储过程