C# Problem z usuwaniem wierszy z bazy

0

Witam,

Dopiero zaczynam programować w C# (i w ogóle programować). Mam problem z usuwaniem wierszy z bazy danych. Ma to być rozwiązane w ten sposób, że mam checkedListBox, zaznaczam id wiersza i usuwam zaznaczone. Mam taki błąd:

Concurrency violation: the DeleteCommand affected 0 of the expected 1 records.

Wiersz się usuwa (ale tylko jeden, nawet jak jest zaznaczonych więcej), ale wyskakuje ten błąd :/
Mój kod:

 
            string sql2 = "SELECT * FROM moty";
            string del = "DELETE FROM moty WHERE id_mota=:id";
            

            NpgsqlConnection conn2 = new NpgsqlConnection(connstring2);

            conn2.Open();
        
            NpgsqlDataAdapter da2 = new NpgsqlDataAdapter(sql2, conn2);

            ds_usun.Reset();
            da2.Fill(ds_usun, "usun_moty");
            dt2 = ds_usun.Tables["usun_moty"];

            NpgsqlCommand cmd = new NpgsqlCommand(del, conn2);

            foreach (object zaznaczone in checkedListBox1.CheckedItems)
            {
                cmd.Parameters.AddWithValue(":id", zaznaczone.ToString());

                

                foreach (DataRow row in dt2.Rows)
                {
                    row.Delete();

                }
            }

            da2.DeleteCommand = cmd;
            da2.Update(ds_usun, "usun_moty");

Proszę bardzo o pomoc.

0

zapamiętaj sobie -foreach może być używane tylko do odczytywania danych z tablicy!!! foreach nie może być używane jeżeli **usuwasz **elementy z tablicy którą używasz w tym przypadku dt2.Rows. Zamień foreach na pętlę for(...). Napisz czy to coś pomogło.

0

Niestety nie pomogło. Dalej ten sam błąd. Czytałem o to, że tabela się nie uaktualnia po usunięciu jednego wiersza czy coś takiego. Niby dt.AcceptChanges() powinno pomóc, ale jak tego używam, to nie ma błędu, ale też nic nie usuwa. Nie umie tego rozgryźć.

0

na oko moim zdaniem instrukcja delete nie ma żadnego wiersza do skasowania, a metoda oczekuje, że będzie conajmniej 1.
Wtedy przy zerowej liczbie rzuca wyjątek.
Spróbuj przetestować selecta, gdzie zamiast kasować wiersz z warunkiem where zwracasz go. Jeśli będzie 0 wierszy, możesz szukać tam przyczyny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1