Как сохранить измененные данные в 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 шт):
Давайте чуточку отвлечёмся от вашего кода и подумаем, как можно было-бы реализовать решение данной задачи. Я сейчас вижу 2 подхода:
- Тупо вставить всё в DGV и так же тупо оттуда достать данные.
Плюсы:
- Быстро
- Просто
Минусы:
- Посылаем нахер всё ООП с объектами и классами
- Придётся почитать информацию о циклах
- Конвертировать полученные из БД данные в класс и манипулировать им
Плюсы:
- Всё по канону. Дядюшка Боб вместе с Аланом Кеем не будут проклинать тебя до самого гроба
Минусы:
- Придётся почитать про классы, свойства, поля, привязку данных и прочее
Итак, а теперь к подробностям:
Первый способ. Про то, как прочитать данные из таблицы и вставить её в 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 ...(где нужно поменять)");
}