Как сохранить измененные данные в dataGridView обратно в sql таблице? Во втором методе не получается сохранить значение в таблице

private SqlConnection sqlConnection = null;
    private void Form1_Load(object sender, EventArgs e)
    {
        sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ConnectionString);

        sqlConnection.Open();

        if (sqlConnection.State == ConnectionState.Open)
        {
            MessageBox.Show("okay");
        }
    }
    class Value {
        public int id { get; set; }
    }
    static void test(string[] args) {
        Value value = new Value();
        value.id = 1;
    }
    public DataRow workrow { get; set; }
    public SqlDataAdapter sqlDB { get; set; }
    public DataSet dataSet { get; set; }
    public SqlCommandBuilder builder { get; set; }
    public DataTable dtbl { get; set; }
    public void button1_Click(object sender, EventArgs e)
    {
        sqlDB = new SqlDataAdapter("SELECT * FROM TestFormValue", sqlConnection);
        dtbl = new DataTable();
        sqlDB.Fill(dtbl);            
        view1.DataSource = dtbl;
        string str = textBox1.Text;
        for (int i = 1; i <= int.Parse(str); i++)
        {
            dtbl.Rows.Add(workrow=dtbl.NewRow());
            workrow["Question"] = i;

        }
    }
    public void button2_Click(object sender, EventArgs e)
    {
        dataSet = new DataSet("CustomerOrders");
        dtbl = dataSet.Tables.Add("Orders");
        builder = new SqlCommandBuilder(sqlDB);
        sqlDB.UpdateCommand = builder.GetUpdateCommand(true);
        sqlDB.Update(dataSet);
        MessageBox.Show("Update get succesful");
    }

Ответы (1 шт):

Автор решения: Frehzy

Давайте чуточку отвлечёмся от вашего кода и подумаем, как можно было-бы реализовать решение данной задачи. Я сейчас вижу 2 подхода:

  1. Тупо вставить всё в DGV и так же тупо оттуда достать данные.

Плюсы:

  • Быстро
  • Просто

Минусы:

  • Посылаем нахер всё ООП с объектами и классами
  • Придётся почитать информацию о циклах
  1. Конвертировать полученные из БД данные в класс и манипулировать им

Плюсы:

  • Всё по канону. Дядюшка Боб вместе с Аланом Кеем не будут проклинать тебя до самого гроба

Минусы:

  • Придётся почитать про классы, свойства, поля, привязку данных и прочее

Итак, а теперь к подробностям:

Первый способ. Про то, как прочитать данные из таблицы и вставить её в dgv ты уже видимо знаешь. Теперь давай попробуем прочитать эти данные. Выделим то, что должно быть в конечном Update-запросе:

  • ключевое слово (Update)
  • название таблицы
  • ключевое слово (Set)
  • конструкция "название столбца (Header.Name для dgv) - '{данные из ячейки}'"

Таким образом, тебе нужно создать метод, который в цикле будет перебирать все строки (for int i = 0; i < dgv.Rows.Count - 1; i++), получать данные из ячейки соответствующей (dgv.Rows[].Cell[].Value) и формировать из этого SQL запрос, который будет лететь в БД. Стараться писать код для этого даже не буду и тебе не советую.

Второй способ. Итак, мы имеем какой-то DataTable, который мы получили из БД. Давай попробуем конвертировать его в класс. Как это сделать? Давненько отвечал на подобный вопрос - Вылетает программа при считывании данных (классы) Подправьте код ответа под свои нужды.

Итак, теперь мы имеем List с нужным нам классом. Осталось только вставить его в dgv и отслеживать его изменение. Для этого нам поможет привязка данных к dgv. Ответ на этот вопрос - Привязка данных в DataGridView Поправьте код ответа под свои нужды.

Таким образом, мы имеем dgv, к которой привязан наш BindingList. Осталось только считать данные из данного класса и отправить их в базу. Про то, как строится Update запрос в базу написал выше.

Как вы можете сделать - подписаться на OnPropertyChange. В случае срабатывания, мы понимаем, какое свойство изменилось (в качестве параметра передаётся имя) и мы сразу строим на основе этого запрос в БД:

    *someClass*.PropertyChanged += SomeMethod;

private void SomeMethod(object sender, PropertyChangedEventArgs e)
    {
        var changeProperty = *someClass*.GetType().GetProperty(e.PropertyName);
        //ниже пример запроса обновления в БД
        db.Update($"UPDATE *tableName* SET {e.PropertyName} = '{changeProperty.GetValue(*someClass*, null)}' WHERE ...(где нужно поменять)");
    }
→ Ссылка