logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

VB.NET + SQL - Jak poprawnie wyświetlić dane z tabeli tblKlient?

mawor 27 Maj 2013 11:28 3645 14
REKLAMA
  • #1 12350615
    mawor
    Poziom 11  
    Posty: 15
    Witam
    Mam problem z poprawnym wyświetlaniem danych z tabel.

    Gdy wyświetlam jedną tabelą, to wszystko jest ok:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    VB.NET + SQL - Jak poprawnie wyświetlić dane z tabeli tblKlient?


    Natomiast gdy próbuję wyświetlić dwie połączone tabele, to nie otrzymuję danych z tabel:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    VB.NET + SQL - Jak poprawnie wyświetlić dane z tabeli tblKlient?

    Może mnie ktoś nakierować, co robię źle ?
    Z góry dziękuję za wszelką pomoc i wskazówki.
    Pozdrawiam
  • REKLAMA
  • #2 12352924
    Defice
    Poziom 25  
    Posty: 698
    Pomógł: 101
    Ocena: 15
    Może głupia sugestia, ale czy w tabeli są rekordy dla których warunek jest prawdziwy? Innymi słowy czy jest taki klient, który spełnia warunki zapytania? Trudno nie widząc tabeli stwierdzić to na 100%

    Skoro nie wyrzuca błędu to chyba zapytanie jest prawidłowe.
  • #3 12353204
    cepelia
    Poziom 20  
    Posty: 341
    Pomógł: 40
    Ocena: 9
    spróbuj wykonać to zapytanie bezpośrednio w sql server menager'rze
  • #4 12353321
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Nie dam głowy, że dataadapter.Fill() jest w stanie wypełnić obydwie tabele tak, jak to zapisałeś - wydaje mi się, że nie. Tzn. traktuje on to jako jedną długą nazwę tabeli z przecinkiem w środku, więc działa, ale nie wiem czy to o to chodziło....
    W dodatku w tej chwili nie wyświetlasz żadnych danych z tabli klientów, tylko z samej tblZlecenie. Co do reszty to jak koledzy piszą - sprawdź, czy inner join ma wspólne ID w obydwu tabelach.
  • REKLAMA
  • #5 12353763
    cepelia
    Poziom 20  
    Posty: 341
    Pomógł: 40
    Ocena: 9
    słuszna uwaga...

    ja wiem że jest ze 100 sposobów na zapisanie tego co chcesz zrobić ale powiem ci jak ja to robię... (według mnie najprościej bo używam kreatorów z VS)

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    przykładowa procedura wywoływana podczas textchange i służąca jak się domyślasz do filtrowania wyników...

    tak więc po kolei początek chyba jasny, później delikatna zmiana gdyż wolę tworzyć sobie swoje stored procedure żeby zapytań nie stroić za każdym razem (poza tym względy wydajności tak wysyłasz tylko parametr i otrzymujesz dane, a jak wysyłasz zapytanie to wysyłasz treść zapytania i za każdym razem serwer musi utworzć plan wykonania...itd)
    dalej już podobnie jak u ciebie z tą różnicą że nie wykonuję polecenia w tray - catch (choć może powinienem), jak widzisz wynik z całego polecenia jest zapakowany do dataseta (bez podawania nazwy tabel) a dopiero później wybieram do DataSource którą tabelę chcę mieć jako źródło danych, i jak widzisz nie używam nazw tylko indeksów tabel (jak debugujesz program to w widoku nie ma nazw tabel tylko indeksy- względy wygody).

    to tyle co do techniki wykonania zapytania, teraz zapytanie :)

    Kod: SQL
    Zaloguj się, aby zobaczyć kod


    to oczywiście tylko fragment zapytania ale jak możesz zauważyć joinowanie wykonuje się po to aby wyświetlić sobie dane z dwóch różnych tabel a jak kolega zauważył tego nie robisz...

    dlatego napisałem wykonaj zapytanie w sqlmenagmentstudio wtedy łatwo wszystko można zobaczyć...
  • #6 12404511
    mawor
    Poziom 11  
    Posty: 15
    Bardzo dziękuję za zainteresowanie tematem.
    Powyższe wypowiedzi okazały się bardzo pomocne.

    Jak się okazało tworzona przeze mnie aplikacja w VB.NET sama w sobie działa poprawnie. Problemem okazał się brak wartości w kluczach obcych danej tabeli. Mianowicie w każdej tabeli, w której mam klucz obcy do innej tabeli występuje w nim wartość "NULL"
    Po ręcznym wpisaniu wartości do kolumny klucza obcego wszystko zaczęło funkcjonować, zarówno w sql management jak i w aplikacji.

    VB.NET + SQL - Jak poprawnie wyświetlić dane z tabeli tblKlient?

    Wnioskuję, że musiałem źle stworzyć wszystkie tabele, a robiłem to w następujący sposób, np:

    Kod: SQL
    Zaloguj się, aby zobaczyć kod


    Następnie dodawałem klucz obcy:
    Kod: SQL
    Zaloguj się, aby zobaczyć kod


    VB.NET + SQL - Jak poprawnie wyświetlić dane z tabeli tblKlient?

    Po wprowadzeniu danych do tabel, w kluczu obcym mam wartości "NULL"

    VB.NET + SQL - Jak poprawnie wyświetlić dane z tabeli tblKlient?

    Proszę o kolejne wskazówki
    Pozdrawiam
  • #7 12407077
    cepelia
    Poziom 20  
    Posty: 341
    Pomógł: 40
    Ocena: 9
    zobacz tutaj...

    http://visuastudio-vbnet.blog.pl/2013/01/17/35/

    moim zdaniem masz źle napisane zapytanie...
    podaj strukturę tych dwóch tabel sql i dokładnie napisz co chcesz wiedzieć (widzieć w dgv)
    być może chodzi ci o pokazanie czegoś na zasadzie master-detail view.. czyli np. lista zamówień - szczegóły zamówienia...
  • REKLAMA
  • #8 12417671
    mawor
    Poziom 11  
    Posty: 15
    Zapytanie jest ok.
    W chwili obecnej, by rozwiązać mój problem i zamknąć temat, potrzebuję informacji, czy jest możliwość zrobić tak, by wartość klucza obcego automatycznie przybierała wartości takie same jak klucz główny ?
    Np: Jeśli klucz główny IdZlecenia w tabeli tblZlecenie jest liczba porządkową zwiększaną o 1 (1,2,3,4.....n) jak zrobić, by wartość klucza obcego IdZlecenie w tabeli tblKlient automatycznie przyjmowała tą samą wartość w celu utworzenia relacji między tabelami.
  • #9 12418398
    cepelia
    Poziom 20  
    Posty: 341
    Pomógł: 40
    Ocena: 9
    to się robi inaczej...

    napisz proszę to o co prosiłem...
  • #10 12418519
    mawor
    Poziom 11  
    Posty: 15
    Np chciałbym połączyć 2 tabele tblKlient i tblZlecenie.
    Struktura tych tabel pokazana jest poniżej:
    VB.NET + SQL - Jak poprawnie wyświetlić dane z tabeli tblKlient?

    Klucze główne mają własność IDENTITY

    Z kontrolek TextBox wprowadzam takie dane jak: Imię, Nazwisko, Telefon, Mail oraz Data przyjęcia, Data wydania i Status.

    Chciałbym zrobić tak, by np klucz obcy IdZLecenia z tabeli tblKlient automatycznie był taki sam jak klucz główny IdZlecenia w tabeli tblZlecenie
  • REKLAMA
  • #11 12418604
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Dopiero teraz widać błąd logiczny w strukturze tabel: tblKlient ma klucz obcy do tblZlecenie, a tblZlecenie klucz obcy do tblKlienta. To jakieś dziwne odwołanie cykliczne - tak się tego nie robi.
    Po pierwsze: zakładając, że każde zlecenie musi mieć klienta, pole IdKLienta w tblZlecenie musi być NOT NULL (pozostałych kluczy obcych potencjalnie też to dotyczy).
    Po drugie: z tabeli tblKlient usuń IdZlecenia, bo jest tam zupełnie zbędne.
    Po trzecie: skoro za każdym razem podajesz pełne dane klienta, po co w ogóle tabela tblKlienci? Powinieneś mieć możliwość dodania nowego klienta np. na osobnym ekranie, a na ekranie z przyjmowaniem zleceń - wybierać gotowego z listy już istniejących. Wtedy masz jego IdKlienta, które możesz użyć w zapytaniu INSERT w tblZlecenia.
  • #12 12418639
    cepelia
    Poziom 20  
    Posty: 341
    Pomógł: 40
    Ocena: 9
    nadal nie napisałeś tego o co prosiłem.. tzn co chcesz zobaczyć i jak ?

    domyślam się że mamy doczynienia z relacją jeden do wielu gdyż jeden klient może mieć kilka zleceń ale zlecenie może być przypisane tylko do jednego klienta (chyba że się mylę więc napisz bo wtedy będzie to inaczej zrobione).

    domyślam się również że chcesz to wyświetlić w 2 datagridview gdzie w jednym będzie lista klientów a w drugim lista zleceń... (chyba że odwrotnie to też napisz).

    domyślam się że chodzi tylko o selecta...

    nie wiem jak używasz połączenia do sql'a bo jest kilka różnych opcji... ja napiszę ci to tak jak ja to robię (choć możesz użyć do tego celu konstruktorów dostępnych w VS) przy użycie sqlclient.

    przyjmijmy że w pierwszym dgv będziemy mieli takie dane o kliencie jak imię, nazwisko, nr telefonu i adres mailowy (możemy mieć również licznik zleceń które są otwarte bądź licznik zleceń które były zamówione kiedykolwiek przez danego klienta bądź jakikolwiek licznik dotyczący danego klienta) możemy również ukryć klientów którzy aktualnie nie posiadają żadnego otwartego zlecenia.

    w drugim dgv (bądź tekstboksach lub labelach obojętnie) będziemy wyświetlać szczegóły zlecenia danego klienta (lepiej jednak wyświetlić listę i dopiero po wybraniu z listy wyświetlić szczegóły ze względu na to że może zaistnieć taka sytuacja że jeden klient będzie miał otwarte więcej niż jedno zlecenie i trzeba będzie je rozróżnić)

    oczywiście możesz to zrobić odwrotnie a nawet ze strony pracownika serwisu było by to bardziej naturalne gdyż nie interesują go wszyscy ludzie świata tylko zlecenia które ma w danym momencie na warsztacie...

    teraz kilka zdań w temacie konstrukcji bazy...
    jeżeli chodzi o tblKlient to:
    jak już zauważyłeś wiele pól ma podobne nazwy i sam użyłeś nawet notacji IdKlienta... ale dlaczego nie trzymasz się tego do końca i nie użyłeś ImieKlienta itd??? takie praktyki mszczą się niemiłosiernie później...

    ja jednak proponuję aby użyć nazw w ten sposób...
    id_kli
    kli_imie
    kli_nazwisko
    kli_telefon
    kli_mail
    kli_id_zlecenia

    takie podejście do sprawy ułatwia życie gdyż w intelisense nazwy będą się wyświetlać w odpowiedniej kolejności tak więc jeżeli będziesz chciał znaleźć jakieś id to powinna ci się wyświetlić lista wszystkich dostępnych id...
    natomiast jeżeli będziesz chciał uzyskać dostęp do kolumny w tabeli klient to po wpisaniu kli_ otrzymasz listę wszystkich kolumn dostępnych w danej tabeli... ot taka pierdoła ale się sprawdza...

    tabela zlecenia potraktowana zostanie tak samo... z tym że masz tam pole status i podejrzewam że jest ono użyte przez ciebie do określania statusu zamówienia czyli "zrealizowane" "w trakcie" czy jakoś podobnie...

    otóż nie robi się tego w ten sposób.. powinno się wystawić "flagę" czyli status powinien być boolean a nie string... (chodzi o sposób sortowania i szybkość działania sql'a)
    jeżeli potrzebujesz więcej niż jednego typu statusu to możesz użyć dwóch pól flaga i masz gotowy opis 4 rodzajów statusu...

    jeszcze jedno na przyszłość... jeżeli ktoś prosi o strukturę tabel to nie wstawiasz okienka z bitmapą tylko używasz prawego przycisku myszy klikając na nazwie bazy wybierasz Tasks potem Generate script i dalej z kreatora otrzymujesz coś takiego...

    Kod: SQL
    Zaloguj się, aby zobaczyć kod

    tak więc mam prośbę abyś odpowiedział w punktach na zadane przeze mnie pytania i jak wrócę z zakupów to ci sklecę jakiś kod...

    Wracając do tematu...

    utworzymy tabelę z przykładowymi danymi... (zwróć uwagę na nazwy występujące w moim skrypcie żebyś sobie przypadkiem nie usunął tabeli z danymi)
    Kod: SQL
    Zaloguj się, aby zobaczyć kod


    mając już przykładowe dane 20 tyś klientów i 100 tyś zgłoszeń możesz przejść do strojenia zapytań...

    podstawowe zapytanie pokazujące nr zlecenia i podstawowe dane o kliencie ...

    Kod: SQL
    Zaloguj się, aby zobaczyć kod


    teraz dodając warunki ii opcje sortowania możesz otrzymać wszystko co sobie chcesz...

    i tak np. możesz sobie pobrać listę wszystkich zleceń wydanych od 1 stycznia 2013 do 1 lipca 2013

    Kod: SQL
    Zaloguj się, aby zobaczyć kod


    zmieniając warunek na zle_flaga = 0 otrzymasz wszystkie zlecenia które jescze nie zostały zrealizowane a dodając ORDER BY zle_date_przyjecie posortujesz sobie niezrealizowane zlecenia według daty przyjęcia...

    ale najważniejsze co musisz zrobić to sprawdzić jak będą wyglądać plany wykonania dla twoich zapytań...
  • #13 12434929
    mawor
    Poziom 11  
    Posty: 15
    Witam
    Dziękuję za kolejną porcję pomocy, wskazówek i sugestii.
    Niestety nadal nie radzę sobie z bazą.
    Korzystając z powyższych porad zmodyfikowałem swoje tabele następująco:
    Kod: SQL
    Zaloguj się, aby zobaczyć kod


    Poniżej struktura tabel:
    Kod: SQL
    Zaloguj się, aby zobaczyć kod


    Gdy w swojej aplikacji wstawiam przykładowe dane:
    VB.NET + SQL - Jak poprawnie wyświetlić dane z tabeli tblKlient?

    Otrzymuję komunikat:
    VB.NET + SQL - Jak poprawnie wyświetlić dane z tabeli tblKlient?

    Logiczne jest, że nie można wstawić wartości NULL do kolumny ponieważ ona na to nie pozwala. Dlaczego jednak tak się dzieje ? W jaki sposób uzupełnić wartości kluczy obcych ?

    Wstępnie chciałem zrobić relację jeden do wielu, tak by klient mógł mieć kilka zleceń, jednak z biegiem czasu postanowiłem (przynajmniej tymczasowo) sprawę uprościć. Za każdym razem wprowadzane będą dane klienta i dane zlecenia.

    Docelowo będzie wyświetlane kilka datagridview, jedne będą wyświetlać klientów, inne zlecenia otwarte / zamknięte, jeszcze inne dane sprzętu itp (w zależności od zakładki)

    Na "dzień dobry" chciałbym osiągnąć datagridview z takimi danymi:
    Id zlecenia, Data przyjęcia, data wydania, status, Imię klienta, nazwisko, mail oraz nr tel.
  • #14 12437114
    cepelia
    Poziom 20  
    Posty: 341
    Pomógł: 40
    Ocena: 9
    tutaj masz poprawiony lekko schemat bazy...

    Kod: SQL
    Zaloguj się, aby zobaczyć kod


    a w załączniku projekt który skrobnąłem dziś rano... sprawdź czy może tak być, co byś ewentualnie poprawił i napisz wymyślimy coś.
    do całości trzeba dopisać jeszcze sp dodawanie nowego zlecenia... ale to jutro rano...

    a jeszcze jedno... w clasie serwis zmień sobie connectionstringa na takiego który będzie pasował do twojej bazy... bo zapomniałem i poszedłem grubo (sa)
    Załączniki:
    • SerwisElektroda.rar (94.87 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #15 12440595
    cepelia
    Poziom 20  
    Posty: 341
    Pomógł: 40
    Ocena: 9
    projekt z dopisanym dodawaniem zlecenia...
    tak jak wcześniej zmień connetion stringa w class'ie serwis...

    to poprawiona baza z dopisanymi sp...

    Kod: SQL
    Zaloguj się, aby zobaczyć kod



    myślę że sobie poradzisz... oczywiście w projekcie musisz zastosować kontrolę poprawności danych i różne inne szczególiki (opisy w kodzie).
    w razie pytań pisz...
    Załączniki:
    • SerwisElektroda.rar (98.2 KB) Musisz być zalogowany, aby pobrać ten załącznik.

Podsumowanie tematu

✨ Użytkownik miał problem z poprawnym wyświetlaniem danych z tabeli tblKlient w aplikacji VB.NET korzystającej z bazy danych SQL. Po kilku sugestiach, takich jak sprawdzenie, czy w tabeli są odpowiednie rekordy oraz wykonanie zapytania bezpośrednio w SQL Server Management Studio, okazało się, że problem wynikał z braku wartości w kluczach obcych. Użytkownik poprawił struktury tabel, eliminując cykliczne odniesienia między tblKlient a tblZlecenie oraz dodał odpowiednie klucze obce. W dalszej części dyskusji poruszono kwestie automatycznego przypisywania wartości kluczy obcych oraz optymalizacji zapytań SQL, co doprowadziło do poprawy działania aplikacji.
Wygenerowane przez model językowy.
REKLAMA