2015-01-27 3 views
0

Я могу обновить только 1 строку, но если две или несколько строк, когда я обновляю все значения, то все равно Я не знаю, в чем ошибка, я вставил sqlcommand внутри циклаОбновление нескольких строк в datagridview все равно

 string date = dt_date.Value.ToString("yyyy-MM-dd"); 
     SqlConnection sc = new SqlConnection(ConfigurationManager.ConnectionStrings["POSdb"].ConnectionString); 

     string strQry = "UPDATE CounterChecking " + 
     "SET part_no = @c0,po_no = @po_no,invoice = @invoice,part_name = @c1," + 
     "date = @date,color = @c2,qty_ordered = @c3,qty_for_delivery = @c4,qty_recieved = @c5," + 
     "variance = @c6,unit_price = @c7, total = @c8, remarks = @c9 " + 
     "WHERE po_no= '" + cb_po_search.Text + "'"; 

      foreach (DataGridViewRow row in dataGridView1.Rows) 
      { 

      if (!row.IsNewRow) 
      { 
       sc.Open(); 
        SqlCommand scmd = new SqlCommand(strQry, sc); 
        scmd.Parameters.AddWithValue("@c0", row.Cells[0].Value); 
        scmd.Parameters.Add("@po_no", SqlDbType.VarChar).Value = tb_ponumber2.Text; 
        scmd.Parameters.Add("@invoice", SqlDbType.VarChar).Value = tb_invoice2.Text; 
        scmd.Parameters.AddWithValue("@c1", row.Cells[1].Value); 
        scmd.Parameters.Add("@date", SqlDbType.Date).Value = date; 
        scmd.Parameters.AddWithValue("@c2", row.Cells[2].Value); 
        scmd.Parameters.AddWithValue("@c3", row.Cells[3].Value); 
        scmd.Parameters.AddWithValue("@c4", row.Cells[4].Value); 
        scmd.Parameters.AddWithValue("@c5", row.Cells[5].Value); 
        scmd.Parameters.AddWithValue("@c6", row.Cells[6].Value); 
        scmd.Parameters.AddWithValue("@c7", row.Cells[7].Value); 
        scmd.Parameters.AddWithValue("@c8", row.Cells[8].Value); 
        scmd.Parameters.AddWithValue("@c9", row.Cells[9].Value); 
        scmd.ExecuteNonQuery(); 
        scmd.Dispose(); 
        sc.Close(); 
        MessageBox.Show("Successfully Updated!");} 
      sc.Close(); 
     } 

ошибки нет, но это дает мне все те же данные, каждая строка

+0

похоже, что вы обновляете один и тот же ряд строк внутри цикла, ваше условие WHERE фиксировано: «WHERE po_no = '» + cb_po_search.Text + "'"; –

+0

Я могу добавить больше значения в сетку данных в одном поле po 1: * –

+0

В этом случае вам также нужен еще один уникальный столбец в таблице CounterChecking, а что там PK? Добавьте его в предложение WHERE. –

ответ

1

инициализировать SqlCommand внутри цикла и отчуждать объект после того, как команда будет выполнена. Попробуйте использовать блок try catch finally внутри, наконец, уничтожить объект команды.

SqlCommand scmd; 
do 
    { 
     scmd = new SqlCommand(strQry, sc); 
     scmd.Parameters.AddWithValue("@c0", dataGridView1.Rows[counter].Cells[0].Value); 
     scmd.Parameters.Add("@po_no", SqlDbType.VarChar).Value = tb_ponumber2.Text; 
     scmd.Parameters.Add("@invoice", SqlDbType.VarChar).Value = tb_invoice2.Text; 
     scmd.Parameters.AddWithValue("@c1", dataGridView1.Rows[counter].Cells[1].Value); 
     scmd.Parameters.Add("@date", SqlDbType.Date).Value = date; 
     scmd.Parameters.AddWithValue("@c2", dataGridView1.Rows[counter].Cells[2].Value); 
     scmd.Parameters.AddWithValue("@c3", dataGridView1.Rows[counter].Cells[3].Value); 
     scmd.Parameters.AddWithValue("@c4", dataGridView1.Rows[counter].Cells[4].Value); 
     scmd.Parameters.AddWithValue("@c5", dataGridView1.Rows[counter].Cells[5].Value); 
     scmd.Parameters.AddWithValue("@c6", dataGridView1.Rows[counter].Cells[6].Value); 
     scmd.Parameters.AddWithValue("@c7", dataGridView1.Rows[counter].Cells[7].Value); 
     scmd.Parameters.AddWithValue("@c8", dataGridView1.Rows[counter].Cells[8].Value); 
     scmd.Parameters.AddWithValue("@c9", dataGridView1.Rows[counter].Cells[9].Value); 
     counter++; 
     scmd.ExecuteNonQuery(); 
     scmd.Dispose(); 
     MessageBox.Show("Successfully Updated!"); 
    } while (counter < dataGridView1.Rows.Count);     
+0

Я получил эту ошибку параметризованный запрос '(@ c0)' nvarchar (4000) –

+0

попробуйте снова посмотреть мой код –

+0

@CarloCruz дать полную информацию об ошибке –

0

Вам необходимо воссоздать команду для каждой итерации. Если вы переместите SqlCommand scmd = new SqlCommand(strQry, sc); внутри своего цикла, вы должны быть в порядке. Но лучшим вариантом было бы, чтобы обернуть его в пункте using как так и использовать foreach, чтобы пройти через dataGridView1.Rows коллекции:

 foreach(var row in dataGridView1.Rows) 
     { 
      using (SqlCommand scmd = new SqlCommand(strQry, sc)) 
      { 
       scmd.Parameters.AddWithValue("@c0", row.Cells[0].Value); 
       scmd.Parameters.Add("@po_no", SqlDbType.VarChar).Value = tb_ponumber2.Text; 
       scmd.Parameters.Add("@invoice", SqlDbType.VarChar).Value = tb_invoice2.Text; 
       scmd.Parameters.AddWithValue("@c1", row.Cells[1].Value); 
       scmd.Parameters.Add("@date", SqlDbType.Date).Value = date; 
       scmd.Parameters.AddWithValue("@c2", row.Cells[2].Value); 
       scmd.Parameters.AddWithValue("@c3", row.Cells[3].Value); 
       scmd.Parameters.AddWithValue("@c4", row.Cells[4].Value); 
       scmd.Parameters.AddWithValue("@c5", row.Cells[5].Value); 
       scmd.Parameters.AddWithValue("@c6", row.Cells[6].Value); 
       scmd.Parameters.AddWithValue("@c7", row.Cells[7].Value); 
       scmd.Parameters.AddWithValue("@c8", row.Cells[8].Value); 
       scmd.Parameters.AddWithValue("@c9", row.Cells[9].Value); 
       scmd.ExecuteNonQuery(); 
       MessageBox.Show("Successfully Updated!"); 
      } 
     } 

Преимущество пункта using является то, что он будет автоматически вызывать Dispose() метод на перед тем, как выйти из этого предложения.

+0

эта строка недопустима foreach (dataGridView1.Rows as row) –

+0

Я исправил ее , К сожалению, он работал в PHP и использовал его в этом синтаксисе. – JRLambert

+0

попробуйте снова посмотреть мой код –

Смежные вопросы