2017-10-04 41 views
0

我想更新的DataGridView插入新行如果要是使用如下SQL過程現有的記錄不存在的記錄和更新數據插入的DataGridView時:編輯 重複的行使用SQL存儲過程和C#錯誤

ALTER PROCEDURE [dbo].[proc_TBL_PROC_PMS_Update] 
     @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 
     UPDATE [ENVNDIVDB].[dbo].[TBL_PROC_PMS] SET [email protected]_GOODS_CD,[email protected]_GOODS_NAME, _UNIT = @_UNIT,[email protected]_QTY, 
       [_UPDATE_DATE]=(select LEFT(CONVERT(VARCHAR, GETDATE(), 111), 10))      
       WHERE [email protected]_PROCESS_INST_NO AND _LINE_NO = @_LINE_NO 

    IF (@@ROWCOUNT = 0) 
     BEGIN 
      INSERT INTO [TBL_PROC_PMS]([INDEXNO],[_PROCESS_INST_NO],[_Order_No],[_LINE_NO],[_GOODS_CD],[_GOODS_NAME],[_UNIT],[_QTY]) 
       SELECT @INDEXNO, @_PROCESS_INST_NO,@_Order_No,@_LINE_NO,@_GOODS_CD,@_GOODS_NAME,@_UNIT,@_QTY FROM [ENVNDIVDB].[dbo].[TBL_PROC_PMS] 
       WHERE @_LINE_NO NOT IN(SELECT _LINE_NO FROM [ENVNDIVDB].[dbo].[TBL_PROC_PMS] WHERE [email protected]_PROCESS_INST_NO) AND [email protected]_PROCESS_INST_NO 
     END 

這裏是C#按鈕保存點擊:

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; 
         var _GOODS_CD = item.Cells[4].Value; 
         var _GOODS_NAME = item.Cells[5].Value; 
         var _UNIT = item.Cells[6].Value; 
         var _QTY = item.Cells[7].Value; 
         cmd2.Parameters.AddWithValue("@INDEXNO", lblINDEX.Text); 
         cmd2.Parameters.AddWithValue("@_PROCESS_INST_NO", txtInstNo.Text); 
         cmd2.Parameters.AddWithValue("@_Order_No", txtPONo.Text); 
         cmd2.Parameters.AddWithValue("@_LINE_NO", rowindex); 
         cmd2.Parameters.AddWithValue("@_GOODS_CD", _GOODS_CD); 
         cmd2.Parameters.AddWithValue("@_GOODS_NAME", _GOODS_NAME); 
         cmd2.Parameters.AddWithValue("@_UNIT",_UNIT); 
         cmd2.Parameters.AddWithValue("@_QTY", _QTY); 
         cmd2.ExecuteNonQuery(); 
        } 
       } 

插入1個新行之前:

enter image description here 只插入1行: enter image description here

但保存後,它重複1多行:

enter image description here

+0

你是檢查'!item.IsNewRow'。這將存儲所有現有的行。 – Sefe

+0

如果不檢查!item.IsNewRow。它會複製6行 – user3035133

+0

UPDATE .... IF(@@ ROWCOUNT> 0)BEGIN // do_insert END –

回答

4

,而不是做既是一個UPDATE 喜歡你現有的存儲過程的INSERT做(這將保證至少增加一個額外的行),你應該嘗試兩個選項之一。

  • 只運行INSERT如果UPDATE沒有作用(通過檢查@@ROWCOUNT = 0
  • 通過modifiyng此過程中使用一個MERGE
+0

重複行是我目前的問題,任何人都可以幫助我!謝謝! – user3035133

+0

我剛剛更新了我目前的代碼。請看和幫助。我的問題是它插入重複行 – user3035133

0

我解決我的問題:

--UPDATE EXISTING RECORDS  
        UPDATE [ENVNDIVDB].[dbo].[TBL_PROC_PMS] SET [email protected]_GOODS_CD,[email protected]_GOODS_NAME, _UNIT = @_UNIT,[email protected]_QTY, 
        [_UPDATE_DATE]=(select LEFT(CONVERT(VARCHAR, GETDATE(), 111), 10))      
        WHERE [email protected]_PROCESS_INST_NO AND _LINE_NO = @_LINE_NO 
     --INSERT NON-EXISTING RECORDS 
     IF (@@ROWCOUNT = 0) 
      BEGIN 
       INSERT INTO [TBL_PROC_PMS]([INDEXNO],[_PROCESS_INST_NO],[_Order_No],[_LINE_NO],[_GOODS_CD],[_GOODS_NAME],[_UNIT],[_QTY],[_UPDATE_DATE])  
       VALUES(@INDEXNO,@_PROCESS_INST_NO,@_Order_No,@_LINE_NO,@_GOODS_CD,@_GOODS_NAME,@_UNIT,@_QTY,(select LEFT(CONVERT(VARCHAR, GETDATE(), 111), 10))) 

      END