usuwanie z bazy i problem z indeksem

0

korzystam z dgv i chce usunac z bazy sql severa rekord. najpierw usuwam go z lokalnej bazy korzytajac z binding source oraz RemoveAt(index). tylko ze po edycji bazy(dodanie i usuniecie rekordów z sql servera) indeksy z kolumny w bazie nie pokrywaja sie z tym w datagrid i usuwane bede wczesniejsze rekordy. jak rozwiazac ten problem

0

Indeksy w sensie numeru wiersza w datagrid? A co z kluczem glownym?

0

ok, wiec pobrałem juz indeks z datagrida tak by usunac wedlug niego odpowiedni rekord z bazy danych, ale pojawiaja sie niestety problemy. niby wiersze sa dobrze indeksowane ale wyskakuje błąd przy usuwaniu dowolnego rekordu:
Naruszenie współbieżności: element DeleteCommand dotyczy następującej liczby rekordów: 0 (oczekiwana liczba rekordów: 1). -> nie wiem czemu nie widzi rekordu

przy usuwaniu ostatniego rekordu(również gdy usuwam go tylko lokalnie):
Indeks jest spoza zakresu. Musi mieć wartość nieujemną i mniejszą niż rozmiar kolekcji.
Nazwa parametru: index

kod:

  private void bt_usun_Click(object sender, EventArgs e)
        {
            adapter.DeleteCommand = polaczenie.CreateCommand();
            bs.RemoveCurrent();

            DbParameter id = adapter.DeleteCommand.CreateParameter();
            id.Direction = ParameterDirection.Input;
            id.ParameterName = "id";
            id.Value = (int)dataGridView1.SelectedCells[0].Value;
            adapter.DeleteCommand.Parameters.Add(id);

            adapter.DeleteCommand.CommandText = "delete from employees where employeeid = @id";
            adapter.Update(lokalnaBD, "produkty");
        }

na rekordach nie ma oczywiście żadnych constrainów.

0

Ale zes sie nakombinowal ;)

SqlCommand command = new SqlCommand("delete from employees where employeeid = @id", polaczenie);
command.Parameters["@id"].Value = (int)dataGridView1.SelectedCells[0].Value; //wypadaloby sprawdzic czy istnieja wybrane wiersze i czy wartosc jest intem.
command.ExecuteNonQuery();
//odswiez widok

Pisane z palca, ale to powinno wystarczyc do szczescia ;)

0

okazuje się że jedynym problemem był wiersz: bs.RemoveCurrent(), a konkretnie wystarczyło go przenieść za deklarację parametru i wtedy wszystko działa.

Żeby nie zaczynac nowego tematu: chcę teraz pod button podpiąć możliwość anulowania usunięcia wiersza z lokalnej tabeli - tak żeby po naciśnięciu znów był on widoczny w datagridview. jak to najprościej zrobić. prubowałem juz róznych właściwości dla dgv ale żadna nic nie daje.

0

Możesz to zrobić poprzez wyświetlenie odpowiedniego komunikatu przy naciśnięciu przycisku Usuń.

Do zdarzenia dodajesz coś w stylu:

if(MessageBox.Show("Czy na pewno chcesz usunąć wiersz?", "UWAGA", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
   return

Nie wiem czy o to chodziło...

0

no teoretycznie też tak mozna zabezpieczyc program,
mnie chodzi o zdarzenie które już po usunięciu danych z lokalnej i żródłowej bazy przywróci je do lokalnej bazy - by z powrotem były widoczne w dgv.

0

Jak usuniesz z bazy no to musisz z powrotem dodac, zeby tam bylo :P

W zwiazku z czym albo zapamietuj i przywracaj albo nie usuwaj w ogole i tylko zapamietuj te, ktore maja sie nie pokazywac (a na zakonczenie usuwasz wszystkie zaznaczone do usuniecia).

Zreszta jak usuniesz z DataSource to niekoniecznie zmiany leca od razu do bazy danych. Mozesz sobie usuwac i dodawac w DataTable podpietym jak DataSource i na koniec wyslac zmiany jakims adapterem.

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