Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ASP.NET C# - Pobieranie danych z bazy na podstawie konkretnego wiersza.

byczynho 26 Lut 2013 17:50 4446 7
  • #1 26 Lut 2013 17:50
    byczynho
    Poziom 19  

    Witam.
    Jestem w trakcie robienia projektu zaliczeniowego, dokładnie dziennika uczniowskiego.
    W moim projekcie administrator dodając wychowawcę do bazy (tabela: wychowawcy) automatycznie tworzy dla niego konto gdzie login to PESEL a hasło to nazwisko. Tak samo jest w przypadku kiedy wychowawca dodaje do bazy uczniów (tabela: uczniowie).
    Kiedy loguje się na konto wychowawcy np (12345678911, Kowalski) w górnym prawym rogu wyświetla się tekst "Witaj 12345678911". Jak zrobić aby wyświetlało się tam "Witaj Kowalski".
    W SqlDataSource robię coś takiego:

    Kod: sql
    Zaloguj się, aby zobaczyć kod

    gdzie @pesel to:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    I w GridView otrzymuje to co chcę. Niestety nie potrafię zastosować czegoś takiego do wyżej opisanego problemu.
    Pomóżcie.

    0 7
  • #2 26 Lut 2013 22:29
    wiesniak
    Poziom 31  

    Pokazałeś samo zapytanie do bazy. Przedstaw cały kod pobierający oraz to, co robisz z wynikami pobierania.
    Zamiast ADO.NET mógłbyś spróbować użyć entity framework - wygodniejszy w użyciu i pewnie na Twoje potrzeby całkowicie wystarczający (przeszukaj moje posty - wrzucałem demko EF jakiś czas temu).

    0
  • #3 26 Lut 2013 22:57
    byczynho
    Poziom 19  

    Kod pobierający generuje się sam. Wybieram kontrolkę SqlDataSource, wybieram połączenie z bazą danych, wybieram tabele która mnie interesuje, zaznaczam opcję automatycznego generowania komend i OK.
    Przykładowo w SqlDataSource wybieram sobie połączenie edziennik, z tabeli wychowawcy wybieram id_wychowawcy i dodaje warunek WHERE pesel = pesel(moja zmienna). W rezultacie dostaje id wychowawcy, który jest zalogowany. Jak to id wrzucić do zmiennej IDwychowawcy ?

    0
  • #4 26 Lut 2013 23:15
    wiesniak
    Poziom 31  

    Ah, SqlDataSource... Tak dawno z tego korzystałem, że zapomniałem o czym mowa.
    W Page_Load wykonaj select na tym datasource (datasource.Select(argumenty)). W wyniku dostaniesz DataView, z którego możesz wyciągnąć potrzebną Ci wartość.
    Musisz też przekazać parametr - albo możesz zdefiniować SelectParameters w markupie albo przypisać w zdarzeniu Selecting tego DataSource.
    Przykład kodu znajdziesz tu http://www.mikesdotnetting.com/Article/64/Bind-Data-From-a-SqlDataSource-to-a-Label oraz tu http://msdn.microsoft.com/en-us/library/syste...bcontrols.sqldatasource.selectparameters.aspx

    0
  • #5 26 Lut 2013 23:26
    byczynho
    Poziom 19  

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Zobacz w jaki sposób aktualnie wyciągam potrzebne mi dane. Jeden wielki śmietnik... Co polecasz bardziej od SqlDataSource i dlaczego?

    Dodano po 2 [minuty]:

    Przy okazji powiedz mi, jak z takiej tabeli:
    Code:

    [db.oceny]
    id_oceny
    id_ucznia
    id_przedmiotu
    ocena
    data

    wyciągnąć np wszystkie oceny z matematyki do jednego wiersza? Bo aktualnie to tyle ile mam ocen tyle razy wyświetla się przedmiot.

    0
  • #6 26 Lut 2013 23:34
    wiesniak
    Poziom 31  

    Nie lubię DataSource'ów, bo raz, że pakujesz wszystko do markupu (od GUI po bazę), to jeszcze wszystko robi się "automagicznie". Preferuję przede wszystkim podział aplikacji na warstwy (osobno GUI, osobno obsługa bazy, po drodze jeszcze może osobno logika biznesowa) - oczywiście wszystko zdroworozsądkowo, bo nie ma zbytnio sensu robić kilku warstw na potrzeby dwóch formatek / stron. Druga sprawa to pobieranie danych - lubię mieć to pod kontrolą i pobieram jak również przypisuję dane w kodzie.
    Powtórzę to, co napisałem - polecam Entity Framework. Jest wygodny w użyciu przede wszystkim. Pozwala zmapować tabele i widoki na kolekcje w aplikacji. Pozwala też na użycie procedur składowanych, jeśli takie podejście lubisz.
    Zobacz demko, które przygotowałem https://www.elektroda.pl/rtvforum/viewtopic.php?p=11874967#11874967

    Co do drugiego pytania, to zależy od silnika bazy. Niektóre pozwalają na sklejenie wierszy za pomocą istniejącej funkcji. W innych będziesz musiał napisać własną funkcję sklejającą. Opcja kolejna to pobrać wszystko jak leci i skleić w aplikacji (np. za pomocą string.Join). Jeśli użyjesz EF albo będziesz miał wynik w czymś, co pozwala na użycie Linq, wystarczy odpowiednie zapytanko i wszystko ładnie się zrobi. Poza tym jest pytanie, czy np chcesz grupować po uczniach itd. Ale generalnie Linq daje radę :-)

    0
  • #7 27 Lut 2013 02:20
    byczynho
    Poziom 19  

    Grupowanie ma być tylko po przedmiotach. Jest to zrobione tak, że uczeń po zalogowaniu widzi tylko swoje oceny. Wkurza właśnie to, że ta nazwa się powtarza tyle razy....

    Dodano po 2 [godziny] 34 [minuty]:

    Jak za pomocą tego EF skleić to w całość?

    0
  • #8 27 Lut 2013 08:00
    wiesniak
    Poziom 31  

    Zobacz na przykład. Odruchowo zrobiłem aplikację formsową, ale to bez znaczenia. Wszystko jest zaszyte na sztywno, ale chodzi o ideę. Przeanalizuj kod - kolekcja oceny symuluje zmapowaną tabelę z bazy. Wziąłem żywcem tabelkę, którą podałeś, ale Linq pozwala na zrobienie joinów, więc bez problemów będziesz mógł dodać np nazwy przedmiotów. Możesz też zmapować w EF widok stworzony na bazie danych, a klasy OcenyUcznia nie musisz tworzyć - możesz stworzyć typ anonimowy - też zadziała.
    Mógłbyś nawet zostać przy swoich DataSource'ach, bo możesz w nich wskazać metodę, która zwróci dane, a przecież to może być metoda pobierająca dane z EF.

    0