C# i TableAdaptery, które nie działają.

0

Sprawa prosta, piszę program okienkowy korzystający z bazy danych.
Mam utworzone:

  1. sqlConnection
  2. dataSet
  3. BindingSource i TableAdapter dla zapytania typu SELECT A JOIN B
  4. dataGridView podpięty do powyższego BindingSource

Plan: Zmieniam wiersze w dataGridView i chcę zapisać dane do bazy. Podobno robi się to wywołując metodę Update na Adapterze.

Pierwsza sprawa, TableAdapter'owy Wizard nie potrafi wygenerować zapytań (i metod) UPDATE, INSERT dla zapytania zawierającego JOIN. Wyczytałem w necie, że przy złożonych zapytaniach Wizard wygeneruje tylko kod dla SELECT'a (te metody i inne bzdety).

Druga sprawa, napisałem sobie te zapytania ręcznie za pomocą DataSet Designera. W Adapterze pojawiła się nowa pozycja poniżej standardowego (Fill, GetData), a mianowicie: UpdateQuery(...)

Problem się pojawia przy próbie zapisania zmian z DataSet'u do bazy.

Robię to tak:

bajerZJoinemTableAdapter.Adapter.Update(this.mojDataSet.bajerZJoinem);

Wyskakuje wyjatek z komunikatem

Operacja Update wymaga prawidłowego elementu UpdateCommand podczas przekazywania kolekcji DataRow ze zmodyfikowanymi wierszami.

No ale przecież utworzyłem mu UpdateQuery.

Da się oczywiście wywołać ręcznie metodę bajerZJoinemTableAdapter.UpdateQuery, która jednak przyjmuje bezpośrednio parametry (kolumny), a ja chciałbym to zrobić na całym DataSet'cie, żeby wszystkie zmiany zapisały się automagicznie, jak to powinien Adapter właśnie robić.

Dla zapytań bez joina, Wizard generuje metody i zapytania dla update i insert, wtedy działa wszystko bez problemu.

Pytanie: Co robię źle? Jak podpiąć Adapter.Update do DataTable operującym na zapytaniu SELECT z joinem?

Z góry dzięki za pomoc.

0

W DataSet Designerze klikasz na nagłowek zapytań (czyli tą belkę pod listą kolumn) i tam wpisujesz zapytanie Update.

0

TomaszSmykowski: To nic nie zmienia.
W dokładnie ten sam sposób jaki opisałeś utworzyłem zapytanie Update.

Przy wywołaniu costamAdapter.Adapter.Update(...) otrzymuje jednak ten sam wyjątek co wcześniej:

InvalidOperationException: Operacja Update wymaga prawidłowego elementu UpdateCommand podczas przekazywania kolekcji DataRow ze zmodyfikowanymi wierszami.

Próbowałem nazwać zapytanie Update utworzone w DataSet.Designerze jako UpdateCommand lub Update (tego drugiego się nie da, automatycznie zmienia się na Update1), nic to nie pomaga.

:/

0

No wygląda na to że jednak nie robisz czegoś dobrze.

Sprawdź te rzeczy:

  1. czy Twoja tablica ma klucz główny i kolumnę identity
  2. czy Twoje zapytanie UpdateCommand działa w SQL Management Studio.
  3. czy w końcu ustawiłeś UpdateCommand. Bo nie chodzi o to żeby dodawać zapytanie, ale żeby kliknąć na belkę pod listą kolumn. Kiedy to zrobisz we właściwościach pojawią się pozycje: SelectCommand, UpdateCommand (!) i inne. Właśnie tam zmodyfikuj UpdateCommand, a nie dodając zapytanie o nazwie 'UpdateCommand' jako zapytanie dodatkowe pod tą belką, bo to nic Ci nie da.

jeżeli nic nie pomoże, wklej na forum jakie masz zapytania SelectCommand i UpdateCommand i jaką masz strukturę tabeli i najlepiej jeszcze zrzutkę XDSa.

0

TomaszSmykowski, pierwsza rzecz, to nie mam możliwości dodania Update inną metodą niż poprzez dodanie po prostu takiego zapytania.

Zerknij na screen (VS 2008). Jak dam AddQuery, to otrzymuję to co opisałem w postach powyżej. Skoro jest to błędne, to jak powinienem dodać zapytanie updatujące. Automagiczny Wizard dostępny po kliknięciu Configure, nie generuje zapytania Update (gdyż w zapytaniu jest join).

user image

Wprowadzone zapytanie ręcznie poprzez AddQuery działa, uruchamia się przez ręczne jego wywołanie w SQL Server Management Studio. Problem w tym, że to zapytanie nie podpina się pod metodę Update w Adapterze, działającą na DataSecie.

0

Nie wybieraj "Add Query' tylko wybierz 'properties'. W panelu właściwości będziesz miał UpdateCommand. Rozwiń go plusikiem i tam masz QueryString.

0

TomaszSmykowski:
Strasznie nieintuicyjnie jest to rozwiązane, ale faktycznie pomogło. Dzięki wielkie!

0

To prawda. Niestety MS na razie nie chce uszczęśliwić programistów zmianami w tej materii

0

Witam ponownie, natknąłem się na drugi problem.

O ile własność UpdateCommand udało mi się ustawić z pomocą TomaszaSmykowskiego, to z InsertCommand sprawa nie wygląda już tak prosto. Nie ma w ogóle takiej własności na liście "Properties".

To jakaś paranoja. Mam to zaklepać ręcznie kodem?

0

To jakaś paranoja. Mam to zaklepać ręcznie kodem?
To cos strasznego?

PS.

KURS PROGRAMOWANIA I ALGORYTMIKI W KRAKOWIE
...

0

exeman,

Nie mogę uwierzyć że na liście nie ma InsertCommand. Wrzuć zrzutkę z ekranu, bo może mówimy o czymś innym.

0

Edit:

Ja to chyba jestem ślepy :)
Oczywiście jest.

0

[soczek]

0

Proszę o skasowanie tego postu.

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