C# 使用2个存储过程更新现有记录并仅插入Datagridview的新记录
我想使用2个存储过程insert、update更新现有记录,同时只插入DataGridView的新记录 但我不知道如何确定哪一行是新插入的行,哪一行是现有行 如果行存在,我想调用存储过程Update,否则我想调用Insert 以下是两个程序: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
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,您的主键是什么?如何识别行,如何使它们唯一?这对于给你正确的建议很重要。