Member 13985914 Ответов: 1

Как сохранить только измененные данные из datagridview в C#


у меня есть проблема, я создаю редактируемый datagridview, в котором в каждой строке есть кнопка "Обновить", когда я делаю изменение в строке и нажимаю кнопку "Обновить", то он сохраняет только измененные данные и отклоняет все данные

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

так что в основном у меня есть две проблемы: 1) Как обнаружить изменения в datagrid 2) а затем сохранить только измененные строки!

Что я уже пробовал:

я попробовал это сделать но он сохранил все данные отредактированные данные и неотредактированные данные


частная dataGridView1_CellContentClick недействительным(объект отправителя, DataGridViewCellEventArgs е)
{
Строку запрос = "вставить в b_bsale(b_bsale.item_id, b_bsale.sale_price, b_bsale.кол-во) значений ('" + dataGridView1.Rows[j].Ячейки[0].значение+ "','" + dataGridView1.строки[j].Ячейки[1].Значение+ "','" + dataGridView1.строки[j].Ячейки[2].Значение + "')";
SqlDataAdapter SDA = новый SqlDataAdapter(запрос, con);
против.Открыть();
ПДД.Команды selectcommand.Метод executenonquery();
против.Закрывать();
Ящик для сообщений.Show("Успешно Введены Данные!", "Congragulation!", MessageBoxButtons.Хорошо, MessageBoxIcon.Восклицание);

}

Richard MacCutchan

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

1 Ответов

Рейтинг:
0

OriginalGriff

Не делай этого так! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?
Исправьте это через все ваше приложение, а затем узнайте об использовании команды UPDATE SQL вместо INSERT.

В любом случае вы должны использовать не DataGridViewRows напрямую, а базовый источник данных (DataTable of similar, из которого вы заполнили DGV). Например, DataTable имеет объект DataTable.Метод GetChanges (System.Data) | Microsoft Docs[^] что дает вам желание, в котором вы нуждаетесь.

Но вся ваша проблема приложения с использованием SQL-инъекций в первую очередь. Или у вас не будет базы данных для обновления...


Member 13985914

я не понял этого..."когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:"
и еще одна вещь исправьте мой этот запрос а также упомяните параметризованный запрос
спасибо

OriginalGriff

Весь ваш запрос-это конкатенация строк. И это опасно - поэтому измените его, чтобы использовать параметризованные запросы.

Richard Deeming

const string Query = "INSERT INTO b_bsale(b_bsale.item_id, b_bsale.sale_price, b_bsale.qty) VALUES (@item_id, @sale_price, @qty)";

using (SqlCommand cmd = new SqlCommand(Query, con))
{
    cmd.Parameters.AddWithValue("@item_id", dataGridView1.Rows[j].Cells[0].Value);
    cmd.Parameters.AddWithValue("@sale_price", dataGridView1.Rows[j].Cells[1].Value);
    cmd.Parameters.AddWithValue("@qty", dataGridView1.Rows[j].Cells[2].Value);
    
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();
}

Member 13985914

как объявить "Getchanges" я имею в виду то, что будет телом
Это мои первые неотредактированные данные или измененные данные??

OriginalGriff

Перейдите по ссылке - она включает в себя пример кода!