2009-06-05 8 views
6

Walczę z krnąbrnym projektantem DataSet VS2008, jak się wydaje. Próbowałem zrobić to, co wydaje się być prostym 2-tabelowym rozwiązaniem zbioru danych, gdzie jedna tabela jest po prostu tekstowym znaczeniem dla wartości całkowitej zapisanej w drugiej tabeli. Podstawowa konstrukcja Dane 101.Co się stało z poleceniami Update and Delete mojego TableAdaptera?

Table1 
CharField1 
CharField2 
IntForeignKeyField1 
etc 

Table2 
IntPrimaryKey1 
ValueForKeyField 

To naprawdę nie wpływa problem mam, nie wierzę, jak ja nie chce nic robić, ale odczytać wartości z drugiej tabeli, więc mogę wybierz je w DataGridViewComboBoxColumn w kliencie - nigdy nie będę ich edytować na kliencie. Ale dygresję.

Ponieważ ten program działa w usłudze sieci Web, a ja chciałem mocno wypróbowanego zestawu danych dostarczonego klientom tej usługi internetowej, zdecydowałem się użyć DataSet Designer do zbudowania TableAdapters i całej instalacji hydraulicznej, myśląc, że może być mniej pracować i łatwiejsze w utrzymaniu.

Stworzyłem więc ładne ramki i edytowałem instrukcje wyboru, nakazując projektantowi utworzenie wszystkich poleceń Wstaw, Aktualizuj i Usuń dla adaptera tabeli do użycia. Szczęśliwie się z tym zobowiązałem, informując mnie, że wszystko było zrobione tak, jak prosiłem.

Kiedy jednak próbowałem użyć instrukcji Update, wystąpił błąd informujący, że nie było poprawnej instrukcji aktualizacji! Po bezowocnych poszukiwaniach ludzi z podobnymi problemami w sieci, zagłębiłem się w XML dla zbioru danych. Rzeczywiście, nie ma też instrukcji Update i instrukcji Delete.

Próbowałem całkowicie usunąć i odtworzyć DataSet z projektu, z tymi samymi wynikami. Nie utworzono instrukcji aktualizacji ani usunięcia, mimo że zostało to zgłoszone jako wykonane.

Skończyłem na ręcznym tworzeniu instrukcji Update XML, sprawdzając inny zaprojektowany zestaw danych z innego projektu, aby usługa sieciowa działała. Nie mam jednak wiary w to, że moje zmiany będą trwały przez edycję zainicjowaną przez projektanta i jestem pewien, dlaczego to nie działa. Jakieś pomysły?

Dzięki za wszelkie informacje zwrotne, Dave

+1

Z całkowitego braku komentarzy, uważam, że tak się nie stało z nikim innym, więc mam prawdziwy błąd lub usterkę w mojej implementacji VS2008. Wspaniały. I dostałem również odznakę z kłębami za ten przywilej. – DaveN59

Odpowiedz

13

mogłoby się okazać, że nie ma unikalny klucz podstawowy zdefiniowany dla tabeli?

+0

Doh! Dzięki za wskazanie oczywiste ... – DaveN59

+0

Nie czuć się bzdury o to, po prostu zrobiłem to samo :(Ustawienie PK w DB naprawiono ten sam problem dla mnie – sMaN

0

Mam ten sam problem. TableAdapter nie działa poprawnie, gdy używane są pola z więcej niż jednej tabeli. Byłem w stanie ponownie utworzyć rozwiązanie z następującego artykułu: "Aktualizacja TableAdapter do używania połączeń".

http://www.asp.net/learn/data-access/tutorial-69-vb.aspx

Rozwiązanie polega na tworzeniu własnych Select/Aktualizacja/Wstaw/Usuń procedur. Niestety, podczas gdy byłem w stanie podążać za rozwiązaniem dla bazy danych sqlserver, nadal nie jestem w stanie zmusić go do pracy dla mojej lokalnej bazy danych Access. Wszystkie opcje procedury składowanej są wyszarzone.

Powodzenia!

+0

Dzięki za link do artykułu. problem (a może i twój) jest prostszy, wystarczy, że zdefiniuję klucze podstawowe i relację w projektancie SQL Studio, a VS sprawi, że wszystko będzie w porządku. Nie wiem, jak wyglądają twoje dane, ale VS może uzyskać całkiem sporo informacji z SQL Server - lub nie, pozornie – DaveN59

0

Myślę, że znalazłem rozwiązanie. 1) Utwórz TableAdapter dla głównej tabeli i skopiuj procedurę UPDATE TableAdapter (zapisaną w oknie właściwości TableAdapter) 2) Zmień zapytanie SELECT w "Kreator zapytań Kreatora konfiguracji TableAdapter", aby uwzględnić pola z obu tabel i sprzężenia. 3) Wklej starą procedurę UPDATE do pustej procedury aktualizacji TableAdapter. 4) Po utworzeniu DataGridView można wyświetlać pola z obu tabel i aktualizować tabelę główną. Powtórz kroki dla poleceń INSERT & DELETE.

Jeśli Twoim celem jest aktualizacja obu tabel, spróbuj spojrzeć na informacje o aktualizacji rodzica/dziecka TableAdapter w Internecie. Oto dobry link: http://blogs.msdn.com/bethmassi/archive/2009/05/14/using-tableadapters-to-insert-related-data-into-an-ms-access-database.aspx

+0

Za dużo pracy! :) To jest zasadniczo to, co zrobiłem, aby to działało. Jednak działało to znacznie bardziej przejrzyste i czystsze, bez ręcznej zmiany niczego, kiedy zdefiniowałem klucze podstawowe i relacje w bazie danych - VS2008 zorientował się, jak zrobić to, co trzeba zrobić z tych informacji, bez ręcznej interwencji ... – DaveN59

+0

Masz to rozwiązanie do pracy z MS Access? Mam dokładnie ten problem i próbuję uruchomić twoją metodę. –

0

Wpadłem na ten sam podstawowy problem. Powiedziałem projektantowi danych, aby utworzył wszystkie instrukcje wstawiania, aktualizowania i usuwania. Kiedy poszedłem zaktualizować jedną z tabel, nie było dostępnej aktualizacji. W końcu przeszedłem do pliku .xsd utworzonego przez projektanta danych (wystarczy dwukrotnie kliknąć, aby otworzyć go w IDE). Następnie kliknąłem prawym przyciskiem myszy na pasku tytułu tabeli, który miał problem i wybrałem opcję konfiguracji. Stamtąd kliknąłem przycisk "Opcje zaawansowane", a następnie zaznaczono opcję "Generuj Wstaw, Aktualizuj, Usuń Wyciągi". Po naciśnięciu OK sprawdziłem mój projekt i aktualizacja była dostępna dla adaptera tabeli.

0

To, co George zasugerował, jest wspaniałe. Musimy włączyć opcję "Generuj wstawianie, aktualizowanie, usuwanie instrukcji".

Jednak w VS2013 użycie niepotrzebnych kwalifikatorów tabel w instrukcji selete może spowodować zaburzenie IDE i wygenerować tylko instrukcje SELECT i INSERT. Po prostu usuń te kwalifikatory i powinno być dobrze. Upewnij się, że masz również unikalną PK.

Jeśli chcesz użyć skomplikowanego wypełnienia, np. Stosując filtr, aby zwrócić tylko niektóre wiersze tabeli, możesz wypełnić tabelę danych za pomocą instrukcji select w formularzu zdarzenia obciążenia. W ten sposób wygenerowane instrukcje INSERT, UPDATE i DELETE będą nadal działać, ponieważ DELETE i UPDATE działają na PK.