Return - pobieranie danych z metody i przekazanie do klasy

0

Witam, jestem bardzo początkujący.

Mam zadanie

Projekt: Sklep.
4 klasy:
Transport
Jedzenie
Agd
Książki

W klasie Transport pobieram dane metodą PobierzDane( zapytanie do bazy sql) , dane takie jak:id, nazwa, cena. W metodzie mam min. DataTable towar = new DataTable(); wynikiem jest (return towar;)

Muszę w klasie np. Jedzenie stworzyć konstruktor przyjmujący row i przekazać row do klasy i zapisać te dane np.na listę.

Nie za bardzo rozumiem jaki row i jak to przekazać do klasy?

2

DataTable() przyjmuje listę danych. Ty chcesz przekazać DataRow() do klasy, aby stworzyć "np. listę". Kompletnie nic z tego nie rozumiem, ale skoro potrzebujesz mieć typowaną listę danych to spróbuj pobierać dane za pomocą biblioteki Dapper i zwróć od razu IEnumerable<Transport> albo IEnumerable<Jedzenie> w zależności, z której tabeli pobierasz dane. Potrzebujesz nakierowania jak się to robi Dapperem czy sobie poczytasz sam? Dapper documentation

0

Dzięki za Dappera, myśle że samemu spróbuje, ale na razie dostałem takie zadanie z takimi wytycznymi. Trochę mi ulżyło, że nie tylko ja nie rozumiem do końca.

Abstrachując od tego row, to mając zmienną towar rozumiem, że w tym "towar" mam wszystkie dane jakie wyszły w wyniku zapytania sql w metodzie, tak?
Czyli jeżeli wywołam wszystkie elementy tabeli jedzenie to w zmiennej towar będą wszystkie dane wszystkich kolumn i wierszy?
Jeżeli tak, to w jaki sposób dobrać się do poszczególnych pozycji?
Jak pobrać zmienną towar?

2

Wrzucam przykład w jaki sposób ja to rozumiem:

    public class Towar
    {
        public int Id { get; set; }
        public string Nazwa { get; set; }
        public string EAN { get; set; }

        public Towar(DataRow row)
        {
            Id = (int)row["Id"];
            Nazwa = row["Nazwa"].ToString();
            EAN = row["EAN"].ToString();
        }
    }

użycie

DataTable dt = new DataTable();
foreach(DataRow row in dt.Rows)
{
     Towar towar = new Towar(row);
     // obiekt towaru na bazie wiersza
}
0

Może to głupie pytanie, ale gdzie w tym wszystkim jest zmienna DataTable "towar", ta z "return towar"?
Po co był ten "return towar"? Chciałbym zrozumieć moment "wyłapania" zmiennej towar, którą zwracamy w metodzie.

0

Nazywanie zmiennej typu DataTable "towar" jest błędne, ponieważ DataTable przechowuje kolekcje wierszy. Sam napisałeś ten kod, więc wydaje mi się, że to ty powinieneś wiedzieć co zwracasz i kiedy. Wrzuć kod, może uda się coś rozszyfrować co "podmiot liryczny" miał na myśli.

0

Nie pisałem metody, otrzymałem gotową metodę zwracającą zmienną DataTable towar (racja, nazwa myląca może powinno być np. table), po wywołaniu metody zapytaniem sql (select * from Jedzenie) w zmiennej towar/table mam dane dotyczące wszystkich rekordów z tabeli Jedzenie.

No i moim zadaniem jest dobrać się do tych poszczególnych danych by finalnie stworzyć List<Jedzenie> gdzie poszczególnym elementem był by pojedynczy produkt spożywczy posiadający id, nazwe, cene.

No i nie rozumiem w jaki sposób mam wykorzystać zmienną DataTable towar/table. Zauważyłem foreach, wnioskuje, że mam pętlą przejść po wszystkich elementach i je wypisać, ale nie potrafię dostrzec połączenia, towar/tables z foreach, ani momentu przechwycenia towar/tables.

1

DataTable jedzenie = new DataTable(); // dane z bazy. Dalej nie wiem jak je pobierasz
List<Towar> towary = new List<Towar>(); // Lista towarów. Klasę masz w poprzedniej odpowiedzi

foreach(DataRow row in jedzenie.Rows)
{
     Towar towar = new Towar(row);
      towary.Add(towar);
}

return towary; // Zwracasz listę towarów
0

https://pastebin.com/KCUUG7BZ

tu jest metoda (zamieniłem towar na table)

0

Nie rozumiem dlaczego nie wrzucisz całości? Jakiekolwiek dane wrażliwe możesz sobie "zagwiazdkować". Problem opisujesz bardzo chaotycznie. Kodu nie wrzucasz w ogóle, a jak wrzucasz to nic z niego nie wynika. W między czasie piszesz, że ty tego kodu nie pisałeś. Na wróżenie z fusów musisz sobie znaleźć inne forum. Nas interesują konkrety. Chcesz przekonwertować DataTable na List<T>? To jest jakieś zadanie, zlecenie? Jaki jest cel takiego zabiegu? Dlaczego nie można tego od razu zrobić do listy Dapperem?

0

https://pastebin.com/QquncLfe

Tu całość, to nie ja pisałem ten kod, ja go dostałem z zadaniem od nauczyciela by stworzyć klasy
Jedzenie
Agd
Książki

Metodą pobrać z bazy danych a następnie dobrać się do poszczególnych kolumn. Wskazówką miało być, że należy to przekazać do konstruktora i tam w konstruktorze przypisać do pól.

1

Ja się nie dziwie, że wy później tak piszecie jak nauczyciel daje wam taki kod i każe pisać głupoty. Jest jeszcze opcja, że ty nie zrozumiałeś zadania. Mam wrażenie, że zadaniem jest przekonwertować DataTable do List o określonym typie. Jeśli pobierasz dane z tabeli Jedzenie, w których masz pola - id, nazwa, cena to robisz taką klasę, która odzwierciedla kolumny w tabeli:

public class Jedzenie
{
    public int Id { get; set; }
    public string Nazwa { get; set; }
    public decimal Cena { get; set; }
}

Obiekt DataRow jest wierszem z DataTable.Rows. Jeśli chcesz stworzyć obiekt na podstawie wiersza z tabeli korzystając z konstruktora.

//KONSTRUKTOR
public Jedzenie(DataRow row)
{
    Id = (int)row["id"];
    Nazwa = row["nazwa"].ToString();
    Cena = (decimal)row["cena"];
}

Wyciągasz dane z bazy do DataTable i w pętli po wszystkich wierszach tworzysz obiekt klasy Jedzenie i robisz z nim co chcesz

DataTable table = new DataTable();

foreach(DataRow row in table.Rows)
{
     Jedzenie jedzenie = new Jedzenie(row);
     // obiekt "jedzenie" przyjmuje dane z wiersza
}

Jeśli potrzebujesz listę. To robisz listę danego typu (u nas przykładem jest typ/klasa Jedzenie)

DataTable table = new DataTable();
List<Jedzenie> listaJedzenie = new List<Jedzenie>();

foreach(DataRow row in table.Rows)
{
     Jedzenie jedzenie = new Jedzenie(row);
     listaJedzenie.Add(jedzenie);
}
// tutaj z obiektem "listaJedzenie" robisz co chcesz

Chyba jaśniej już się nie da.

0

Dlatego napisałem, na początku, że jestem bardzo poczatkującym, zadaje sobie sprawę, że moje pytania mogą być chaotyczne.
Dzięki za pomoc.

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