2015-12-22 5 views
-1
private void button1_Click(object sender, EventArgs e) 
{ 
    cn.Open(); 
    SqlCommand cmd = new SqlCommand("UPDATE MEDICINE_REGISTRATION SET stock = @RStock WHERE id= " + Order_Datagridview.SelectedRows[0].Cells["id"].Value.ToString() + "", cn); 

    foreach (DataGridViewRow row in Order_Datagridview.Rows) 
    { 

     // cmd.Parameters.AddWithValue("@RStock", row.Cells["RStock"].Value); 

     cmd.Parameters.Add("@RStock", SqlDbType.VarChar).Value = Order_Datagridview.SelectedRows[0].Cells["RStock"].Value.ToString(); 
     cmd.ExecuteNonQuery(); 
     MessageBox.Show("Success"); 
     cmd.Parameters.Clear(); 

    } 
    cn.Close(); 
} 
+3

Если вы хотите задать вопрос, задайте вопрос. Не просто сбрасывайте код и надейтесь на лучшее. – HoneyBadger

+0

Код обновляет только первую строку. Все, что я хочу, - обновить все строки в datagridview. Когда я нажимаю кнопку. Что мне делать? В чем проблема ? – Shyl

+1

Их очень много. – Oliver

ответ

1

Инициализация условия WHERE находится вне цикла и всегда содержит идентификатор первой строки, а не идентификатор последующих строк. параметров должны быть добавлены для каждого значения, которое вы принимаете от вашей сетки, а также идентификатор должен быть параметризованным

Наконец параметры могут быть добавлены только один раз, а затем вы можете просто обновить их значения

private void button1_Click(object sender, EventArgs e) 
{ 
    cn.Open(); 
    SqlCommand cmd = new SqlCommand(@"UPDATE MEDICINE_REGISTRATION 
            SET stock = @RStock 
            WHERE id= @id", cn); 

    cmd.Parameters.Add("@RStock", SqlDbType.VarChar).Value = ""; 
    cmd.Parameters.Add("@id", SqlDbType.Integer).Value = 0; 

    foreach (DataGridViewRow row in Order_Datagridview.Rows) 
    { 
     // Use the row indexer here, not the fixed row at index zero 
     cmd.Parameters["@RStock"].Value = row.Cells["RStock"].Value.ToString(); 
     cmd.Parameters["@id"].Value = Convert.ToInt32(row.Cells["id"].Value); 
     cmd.ExecuteNonQuery(); 
    } 
    cn.Close();} 
} 

Есть что сказать и об использовании одноразовых объектов, таких как соединение и команда. Эти объекты должны быть созданы при необходимости и размещены сразу после использования. Проверить о using statement для этой модели

+0

Спасибо, сэр, Стив. Сейчас он работает :) – Shyl

0

возможно

foreach (DataGridViewRow row in Order_Datagridview.SelectedRows) 
{ 
    ..... DataGridViewRow.Cells["RStock"].Value.ToString(); 
} 

?

+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). - [Из обзора] (/ review/low-quality-posts/10653406) – maurycy

+0

Ooops .. Думал, что я не мог комментировать, и это выглядело как ответ на меня. Трудно проверить без доступа к db;) – noontz

+0

@noontz: * Несколько слов *, описывающих, что не так в коде афера, помогут вам лучше ответить. Также это мешает другим думать о ответе в качестве комментария. [Как правило, код в ответе должен сопровождаться некоторым описанием.] – Tsyvarev

0

Внутри вашего Еогеаспа, вы не используете DataGridViewRow, вы все еще используете DataGridView.Selected [0]. Если вы хотите сделать это, я хотел бы сделать пару изменений:

  1. сохранить возвращаемое значение ExecuteNonQuery() и MessageBox.Show, что значение
  2. в cmd.Parameters, убедитесь, что вы добавить текущую строку ,
  3. Я бы, вероятно, создал отдельную команду для каждой строки.

Что-то вроде этого, может быть:

private void button1_Click(object sender, EventArgs e) 
{ 
    cn.Open(); 

    foreach (DataGridViewRow row in Order_Datagridview.Rows) 
    { 
     SqlCommand cmd = new SqlCommand("UPDATE MEDICINE_REGISTRATION SET stock = " + row.cless["RStock"].Value + " WHERE id= " + row.Cells["id"].Value.ToString() + " ", cn); 

     MessageBox.Show(cmd.ExecuteNonQuery()); 

    } 

    cn.Close(); 
} 

Если это не сработает, попробуйте схватить DataTable или DataView источник, лежащий в основе этой таблицы и сделать то же самое, что и выше.

+0

Спасибо, сэр. Он работает сейчас :) – Shyl

+0

Спасибо, Шил! Если вы отметите ответ, который сработал для вас, это поможет тем из нас, кто помогает. :) –

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