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