Member 14911825 Ответов: 1

Как удалить записи из таблицы, postgresql, C #


Привет,

Я пытаюсь удалить записи из таблицы, но после реализации следующего кода записи не удаляются.
If I add an item to the list and delete it in the same session, everything is fine. The problem arises when I add items to the list, close the program and after restarting I want to remove the item. Then it is impossible.
MessageBox.Show(item2); - Shows the item I want to delete

Пожалуйста, помогите мне, как это сделать.



private void button1_Click(object sender, EventArgs e) //Aktualizuj
       {

             foreach (var item in checkedListBox1.CheckedItems)
            {
                //Dodanie do archiwalnych zadań
                var cs2 = "Host=localhost;Username=postgres;Password=root;Database=Dziennik";

                var con2 = new NpgsqlConnection(cs2);
                con2.Open();
                var sql = "INSERT INTO zadaniaarchiwalne(zadanie_archiwalne) VALUES(@zadanie)";
                var cmd = new NpgsqlCommand(sql, con2);
                cmd.Parameters.AddWithValue("zadanie", item);
                cmd.Prepare();
                cmd.ExecuteNonQuery();

            }




            foreach (var item2 in checkedListBox1.CheckedItems.OfType<string>().ToArray())
            {
                var cs = "Host=localhost;Username=postgres;Password=root;Database=Dziennik";
                var con = new NpgsqlConnection(cs);
                con.Open();
                MessageBox.Show(item2);
                var sql2 = "DELETE FROM zadania WHERE zadanie=(@zaadanie)";
                var cmd2 = new NpgsqlCommand(sql2, con);
                cmd2.Parameters.AddWithValue("zaadanie", item2);
                cmd2.Prepare();
                cmd2.ExecuteNonQuery();
                con.Close();
                checkedListBox1.Items.Remove(item2);
            }


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

I am trying to write a task list application that connects to a PostgreSQL database

Richard MacCutchan

У вас есть два вызова ExecuteNonQuery, но в обоих случаях вы не проверяете возвращаемое значение, чтобы увидеть, удалась ли команда.

Garth J Lancaster

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

MessageBox.Show(item2);
.. показывает ли это item2, которые вы собираетесь удалить - возможно, использовать Улучшить вопрос и добавьте немного больше деталей

Member 14911825

Если я добавляю элемент в список и удаляю его в том же сеансе, все в порядке. Проблема возникает, когда я добавляю элементы в список, закрываю программу и после перезагрузки хочу удалить этот элемент. Тогда это невозможно.
Ящик для сообщений.Show(item2); - показывает элемент, который я хочу удалить

Luc Pattyn

Ваша формулировка проблемы совершенно неясна.

1. Вы показываете несколько предметов, пожалуйста, объясните, что это такое. Вы работаете с проверенными предметами, что это такое? и во время удаления вы удаляете элементы, образующие дисплей. Что это значит?

2. Непонятно, какие предметы вам показаны, а какие получает проверил. Особенно то, как это отличается между вашим первым и вторым запуском программы.

3. было бы полезно, если бы вы описали реальный сценарий,например: начальный список содержит A,B,C, D с проверенными B и C, затем I ... и т. д.

4. Вы показываете один метод, который сначала добавляет элементы в базу данных, а затем удаляет те же элементы. Какой цели это послужит? и как бы это поддержало ваше заявление об удалении во втором запуске, поскольку нет никакого кода, который только пытается удалить...

5. Это поможет, если вы покажете реальный код.

6. Как уже упоминал Гарт, вы игнорируете возвращаемое значение ExecuteNonQuery. Я бы предложил вам:
- подсчет и отображение количества проверенных элементов
- накапливать возвращение значений из метода executenonquery при добавлении, и показать, что
- накапливать возвращаемые значения ExecuteNonQuery при попытке удаления и отображать это число.
- и не отображать каждый отдельный элемент, который вы пытаетесь удалить.
Таким образом, вы должны видеть только несколько чисел, и все они должны совпадать; когда они не совпадают, вы получаете первый намек на то, что не так.

7. если добавление такой наблюдаемости недостаточно, то сейчас самое время начать использовать отладчик.

8. Наконец, у меня есть несколько комментариев к вашему кодированию; они, вероятно, не повлияют на поведение программы, но улучшение приветствуется:
- нет необходимости открывать и закрывать соединение для каждой итерации в цикле foreach;
- код выглядит намного лучше, если вы применяете оператор using для объектов, которые должны быть удалены после завершения, таких как ваше соединение.
- Мне не нравится твой голос. OfType<string>().ToArray() трюк, позволяющий удалять элементы, все еще перечисляя проверенные элементы. Простота .ToList() должно быть достаточно; лично я делаю это с дополнительным foreach и промежуточным списком, думаю, что things-to-remove-after-foreach-is-done. Это занимает немного больше кода, но более понятно.

Member 14911825

Спасибо за комментарии к моему коду. Я исправил то, что вы упомянули.
Проблема решена, произошла ошибка при чтении данных из базы данных.

1 Ответов

Рейтинг:
1

Chris Copeland

Как уже упоминал Ричард Маккатчан, вы можете проверить значение, возвращаемое из ExecuteNonQuery метод, чтобы увидеть, сколько строк было затронуто вашим запросом. Вы должны увидеть значение больше нуля в обоих случаях, если запросы были выполнены успешно.

Postgres иногда может быть строгим в отношении контроля транзакций, и я вижу, что вы не используете транзакции. Ты не пробовал позвонить BeginTransaction()[^] чтобы увидеть, применяется ли это к изменениям в базе данных?

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


Member 14911825

Спасибо за вашу помощь, ошибка была в том месте, где я читал данные из базы данных.
Он извлек ошибочные данные, а именно несколько пробелов позади значения.