'inserting/updating problem with foreach loop

Problem is that when I run this loop it insert only a few rows from dataset. But there's many rows in dataset. Also in database has no rows. Why not my loop is working? I also want if data already have in database that will be updated with current dataset data.

  conn.Open();
  foreach (DataRow row in dataset.Tables[0].Rows)
  {
     
 
 string cardno = row["cardno"].ToString();
 string style = row["style"].ToString();
 string process = row["process"].ToString();
 int quantity = int.Parse(row["quantity"].ToString());
 float price = float.Parse(row["price"].ToString());
 float total_price = float.Parse(row["total_price"].ToString());
 string month = dateTimePicker2.Value.ToString("MMMM");
 int year = int.Parse(dateTimePicker2.Value.ToString("yyyy"));
 
 string queryInsert = "EXEC SP_AmountProcess '" + cardno + "','" + style + "','" + process + "','" + price + "','" + quantity + "','" + total_price + "','" + month + "','" + year + "','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "';";
 
 SqlCommand cmd2 = new SqlCommand(queryInsert, conn);
 cmd2.ExecuteNonQuery();
 }
 dataGridView1.DataSource = null;
 //dataset.Reset();
 MessageBox.Show("Process Success");
 conn.Close();
 :::Store Procedure (SP_AmountProcess)::::
 CREATE procedure [dbo].[SP_AmountProcess]
  @cardno nvarchar(50),
  @style nvarchar(255),
  @process nvarchar(255),
  @rate float,
  @quantity int,
  @amount float,
  @month nvarchar(50),
  @year int,
  @process_time datetime
 
 AS
 
 IF NOT EXISTS (SELECT '#' FROM TBL_PROCESS_AMOUNT WHERE YEAR =@year AND MONTH=@month AND CARDNO= @cardno)  
 BEGIN  
 UPDATE [dbo].[TBL_PROCESS_AMOUNT]  SET [CARDNO] =@cardno,[STYLE]=@style,[PROCESS]=@process,[QUANTITY]=@quantity,[RATE]=@rate,[AMOUNT]=@amount,[MONTH]=@month,[YEAR]=@year,[PROCESS_TIME]=@process_time  WHERE YEAR =@year AND MONTH=@month AND CARDNO=@cardno ;  
 END  
 ELSE  
 BEGIN                                              
 INSERT INTO [dbo].[TBL_PROCESS_AMOUNT] ([CARDNO] ,[STYLE] ,[PROCESS] ,[QUANTITY] ,[RATE] ,[AMOUNT] ,[MONTH] ,[YEAR] ,[PROCESS_TIME]) VALUES (@cardno,@style,@process,@quantity,@rate,@amount,@month,@year,@process_time); 
 END ;


Solution 1:[1]

change this approach in sp please check i think this might be helpful to u..

:::Store Procedure (SP_AmountProcess)::::

CREATE procedure [dbo].[SP_AmountProcess]
  @cardno nvarchar(50),
  @style nvarchar(255),
  @process nvarchar(255),
  @rate float,
  @quantity int,
  @amount float,
  @month nvarchar(50),
  @year int,
  @process_time datetime
 
 AS
 
 IF NOT EXISTS (SELECT '#' FROM TBL_PROCESS_AMOUNT WHERE YEAR =@year AND MONTH=@month AND CARDNO= @cardno)  
 BEGIN  
INSERT INTO [dbo].[TBL_PROCESS_AMOUNT] ([CARDNO] ,[STYLE] ,[PROCESS] ,[QUANTITY] ,[RATE] ,[AMOUNT] ,[MONTH] ,[YEAR] ,[PROCESS_TIME]) VALUES (@cardno,@style,@process,@quantity,@rate,@amount,@month,@year,@process_time); 
 END  
 ELSE  
 BEGIN   
 UPDATE [dbo].[TBL_PROCESS_AMOUNT]  SET [CARDNO] =@cardno,[STYLE]=@style,[PROCESS]=@process,[QUANTITY]=@quantity,[RATE]=@rate,[AMOUNT]=@amount,[MONTH]=@month,[YEAR]=@year,[PROCESS_TIME]=@process_time  WHERE YEAR =@year AND MONTH=@month AND CARDNO=@cardno ;                                             
 
 END ;

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Amit saini