Usuwanie rekordów - DataGrid/DataSet/DataTable

0

Witajcie!
W końcu przyszedł czas na mnie tutaj.

Mam do zaprogramowania prosty moduł do obsługi bazy danych. Baza składa się z kilkunastu tabel, które po zaczytaniu przez ODBCDataAdapter są zaczytywane do DataSet'u. W nim tworzę osobne tabele będące ekwiwalentem bazodanowych tabel. Na formie trzymam DataGrid, który wyświetla mi konkretną wybraną przez użytkownika (poprzez Comboboxa) tabelę. Na formie znajdują się również buttony służace do: Dodawania pustego rekordu w DataGrid, usuwania zaznaczonego w DataGrid rekordu oraz edycji zaznaczonego rekordu, ponadto zanjduje się tam przycisk do aktualizacji bazy danych.
Aktualizacja bazy danych odbywa się poprzez ww. ODBCDataAdapter. Każda tabela ma przypisany osobny ODBCDataAdapter. Aktualizacja odbywa się poprzez wywołanie metody Update obiektu ODBCDataAdapter.
Dodawanie odbywa się poprzez metodę InsertAt. Natomiast usuwanie poprzez metodę Delete.

Z dodawaniem i edycją rekordów nie ma żadnego problemu. Jednakże problem pojawia się w przypadku chęci usunięcia kilku rekordów. Gdy klikam na przycisku "Usuń" metoda zostaje wywołana i rekord zostaje faktycznie "usunięty" (RowState = Deleted), natomiast ponowne naciśnięcie ww. przycisku nie przynosi żadnego skutku. Dopiero zaktualizowanie bazy danych wraz z wywołaniem metody AcceptChanges na konkretnej tabeli powoduje, iż przy ponownym naciśnięciu przycisku usuń mam możliwość usunięcia kolejnego rekordu itd. Jednakże jest o tyle niewygodne i niepoprawne ze względu na to, iż sens istnienia buttonów OK i Anuluj zostaje naruszony, ponieważ przy naciśnięciu przycisku OK (który wywoluje metodę do aktualizacji bazy danych) nie zaktualizuje tak na prawdę tej bazy, gdyż metoda AcceptChanges zresetuje nam DataRowState dla każdego wiersza.

Poniżej zamieszczam kod kilku metod (m.in. do usuwania, dodawania i aktualizacji bazy). Zaznaczam iż przewertowałem już kilka książek i StackOverFlow.

//Dodawanie na koncu DataGrid'a
procedure TBazaDanychElem.btnDodaj_Click(sender: System.Object; e: System.EventArgs);
begin
  with DataSetElems.Tables[AktywnaTabela].Rows.InsertAt(DataSetElems.Tables[AktywnaTabela].NewRow, Rows.Count);
end;
//Usuwanie zaznaczonego rekordu w DataGrid
procedure TBazaDanychElem.btnUsun_Click(sender: System.Object; e: System.EventArgs);
begin
  with DataSetElems.Tables[AktywnaTabela].Rows do
    begin
      if (Count > 0) then
        Item[CurrentRowIndex].Delete
      else MessageBox.Show('Tabela jest pusta!', 'Warning');
    end;
end;
//Aktualizowanie bazy danych, parametr index - numer aktualizowanej tabeli oraz odp. jej adapter
procedure TBazaDanychElem.SaveToDatabase(index: word);
var
  cmd: OdbcCommandBuilder;
begin
  cmd := OdbcCommandBuilder.Create(ODBCAdapterList.Items[index] as ODBCDataAdapter);

  (ODBCAdapterList.Items[index] as OdbcDataAdapter).Update(DataSetElems.Tables[index]);

  DataSetElems.Tables[index].AcceptChanges;
end;

Z góry dziękuję za pomoc!
Pozdrawiam

0
  1. co to jest ODBCDataAdapter
  2. co to jest DataSetElems

bdw czemu nie użyjesz czegoś normalnego tylko babrasz się z ODBC?

2

W czym to piszesz @Xolu, w Delphi.NET??
A co do odpowiedzi... Przeczytaj swoją wypowiedź dokładnie, doczytaj w dokumentacji jak działają DataSety w .NET, co dokładnie robi metoda AcceptChanges i sam sobie odpowiesz.

0

Tak, Delphi 8 .NET. Dziękuję za rady, problem rozwiązany. Dzięki wloochacz :)

0

No problem @Xolu - sam sobie odpowiedziałeś :-)
Dodamy tylko, że wyrzuć to Delphi 8 na śmietnik tam gdzie jego miejsce. Poważnie.
Chcesz pisać w .NET? Użyj Visual Studio .NET Community.
Chcesz pisać w Delphi? Pisz w Delphi, będzie szybciej, lepiej i przyjemniej ;-)

0

Niestety nie jest to zależne ode mnie. Aczkolwiek w najbliższym czasie czeka mnie przesiadka na .NET 4 wzwyż także myślę, że rozwinę skrzydła :)

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