Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用2个存储过程更新现有记录并仅插入Datagridview的新记录_C#_Sql Server_Stored Procedures_Datagridview - Fatal编程技术网

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

C# 使用2个存储过程更新现有记录并仅插入Datagridview的新记录,c#,sql-server,stored-procedures,datagridview,C#,Sql Server,Stored Procedures,Datagridview,我想使用2个存储过程insert、update更新现有记录,同时只插入DataGridView的新记录 但我不知道如何确定哪一行是新插入的行,哪一行是现有行 如果行存在,我想调用存储过程Update,否则我想调用Insert 以下是两个程序: alter PROCEDURE [dbo].[proc_TBL_PROC_PMS_Insert] @INDEXNO nvarchar(50), @_PROCESS_INST_NO nvarchar(50), @_Order_No n

我想使用2个存储过程insert、update更新现有记录,同时只插入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。这样您就可以安全地识别现有行和新行。

我没有时间为您编写示例,但这应该会对您有所帮助。这是SQL合并,它将根据您的条件执行检查,然后为您执行插入或更新,而无需执行IF EXISTS或IF SELECT…>0开始。。。。这是一种更干净的执行方式。您也可以在这里执行删除操作,但我倾向于远离此操作,并且执行完全独立于合并的删除操作您希望……“使用2个存储过程同时更新现有记录并仅插入Datagridview的新记录”…这两个“不同”是否有某种原因更新现有记录和插入新记录……需要同时完成吗????我缺少什么?我想知道行是否存在,我想调用存储过程更新,否则我想调用Insert。在C.I.gogole中有很多,但都不满足我的要求,当你说“我想知道行是否存在”时……回避了“什么”行存在的问题?您正在查找“什么”行以查看它是否存在?如果网格有3行,您想知道是否存在第5行,那么只需检查网格行数?听起来你在搜索什么。更新datagridview没有问题,只插入此datagridview的新记录非常困难,因为我们只需要插入新行,而不是整个datagridview行。我无法更改表结构,因为它有可能的数据,在操作中,我们只使用现有的表结构,但您有一行。\u否,用户不应输入,但应在插入时分配。您可以将其用作只读列,即伪ID列。我已经使用了行。\u否,更新可以,但插入不能,因为您必须知道哪一行是新插入的行。我不明白您的要求。您需要在DataGridView级别进行区分,或者在SQL中进行区分,这是您在一个单独的可能重复的问题中提出的。在后一种情况下,更新。。。如果@@ROWCOUNT=0,则开始插入。。。END将适用。顺便问一下,如果您没有ID,您的主键是什么?如何识别行,如何使它们唯一?这对于给你正确的建议很重要。