Avatar billede Driton Seniormester
05. juli 2016 - 14:23 Der er 24 kommentarer og
1 løsning

Datafill fejl

Min C# kode ser sådan her ud

MySqlDataAdapter cmd1 = new MySqlDataAdapter("select * from Produktkategori", conn);
        //Create and fill the DataSet.
        DataSet ds = new DataSet();
        cmd1.Fill(ds, "ProduktkategoriID");

        //Create a second DataAdapter for the Titles table.
        MySqlDataAdapter cmd2 = new MySqlDataAdapter("select * from Produkter", conn);
        cmd2.Fill(ds, "FK_Produktkategori");

        //Create the relation bewtween the Authors and Titles tables.
        ds.Relations.Add("myrelation",
        ds.Tables["Produktkategori"].Columns["ProduktkategoriID"],
        ds.Tables["Produkter"].Columns["FK_Produktkategori"]);

        //Bind the Authors table to the parent Repeater control, and call DataBind.
        parentRepeater.DataSource = ds.Tables["Navn"];
        Page.DataBind();

        //Close the connection.
        conn.Close();

Jeg prøver at lave en relation og udtrække data men får fejl på "myrelation".

og mine tabeller ser sådan her ud

-Produkter
ProduktID
Madnavn
FK_Produktkategori
FK_butik

-Produktkategori
ProduktkategoriID
Navn
FK_Butik


Den har masser af data til at teste på. Men virker stadig ikke. Nogen der kan få øje på den lille detajle der gør den stor forskel?
Avatar billede Driton Seniormester
05. juli 2016 - 14:40 #1
Fiksede den første fejl. Men nu får jeg ingen data ud hm :/
Avatar billede arne_v Ekspert
05. juli 2016 - 14:53 #2
DataAdapter og DataSet er noget fanden har opfundet.

Hvorfor ikke bare bruge en DataReader og laese ind i en nydelig data struktur?
Avatar billede Driton Seniormester
05. juli 2016 - 14:55 #3
Ved ikke men jeg fik det til at virke. Det var bare fordi jeg vidste ikke hvordan ellers jeg skulle håndtere et menukort.
Avatar billede Driton Seniormester
05. juli 2016 - 15:00 #4
Arne ved du hvorfor i datalist, så kommer produkterne i en kategori for langt ned?
Avatar billede arne_v Ekspert
05. juli 2016 - 15:01 #5
Det du har ligner i mine oejne meget en:

public class ProductCategory
{
    public string Name  { get; set; }
    public List<Product> Products { get; set; }
}

public class Product
{
    public string Name  { get; set; }
    ...
}

og visning via en nested repeater!

:-)
Avatar billede Driton Seniormester
05. juli 2016 - 15:03 #6
Har fikset det :)

Kører jeg så bare en while loop på produkter før jeg kalder Produkkategori?
Avatar billede arne_v Ekspert
05. juli 2016 - 15:08 #7
Jeg antog at du brugte ASP.NET web forms.

Der kan du bare bruge en nested repeater konstruktion. Det er et ASP.NET tag som reelt er en loekke.

Og jeg er sikker paa at man kan lave noget tilsvarende i ASP.NET MVC.
Avatar billede Driton Seniormester
05. juli 2016 - 17:21 #8
Nu har jeg prøvet at gøre, som du forslog.

Jeg har kodet det her indtil videre

cmd.CommandText = "select * from Produktkategori where FK_Restaurant = @FK_Restaurant";
        cmd.Parameters.AddWithValue("@FK_Restaurant", butikid);

        conn.Open();

        MySqlDataReader reader = cmd.ExecuteReader();
        List<madkategorier> kategori = new List<madkategorier>();
        List<Produkter> produkter = new List<Produkter>();
        while (reader.Read())
        {
            kategori.Add(new madkategorier(Convert.ToInt32(reader["FK_Restaurant"]), reader["Navn"].ToString(), produkter));
        }

        parentRepeater.DataSource = kategori;
        parentRepeater.DataBind();


<asp:repeater id="parentRepeater" runat="server">
<itemtemplate>
<%#Eval("Navn") %>'>
<asp:repeater id="childRepeater" datasource='<%# Eval("produkter") %>' runat="server">

<%# Eval("Madnavn") %>
</itemtemplate>
</asp:repeater>

Hvordan laver jeg logikken til produkter? prøvet mig lidt frem og tilbage uden nogen held. Mangler at blive sæt i en retning.
Avatar billede arne_v Ekspert
05. juli 2016 - 17:23 #9
Hvilken form for logik?
Avatar billede Driton Seniormester
05. juli 2016 - 17:25 #10
Til hvordan jeg får produkter vis i de korrekte kategorier. Jeg prøvede at lave en løkke indenfor løkke. Men det virkede ikke
Avatar billede arne_v Ekspert
05. juli 2016 - 17:54 #11
while (reader.Read())
        {
            kategori.Add(new madkategorier(Convert.ToInt32(reader["FK_Restaurant"]), reader["Navn"].ToString(), produkter));
        }

skal nok vaeret noget a la:

int oldrest = -1;
madkategorier kat = null;
while (reader.Read())
        {
            rest = Convert.ToInt32(reader["FK_Restaurant"];
            if(rest != oldrest)
            {
                  kat = new madkategorier(rest);
                  oldrest = rest;
            }
            kategori.Add(kat, reader["Navn"].ToString(), produkter));
        }
Avatar billede arne_v Ekspert
05. juli 2016 - 18:31 #12
En af pointerne er at du langt bedre kan opdele din kode i lag.

Du har et lagt som producerer den data struktur og et andet lag som viser den. Og det lag som viser den er ikke bundet til nogen bestemt form for lagring. Den struktur bliver laest fra database, men kunne ligesaa godt laeses fra XML fil eller hentes via web service eller noget helt fjerde.

Brug af DataSet faar visnings laget knyttet ret taet til data laget.
Avatar billede Driton Seniormester
05. juli 2016 - 18:43 #13
Arne gjorde sådan her, fra dit eksempel.

cmd2.CommandText = "select  Produkter.*, Produktkategori.*  FROM Produkter INNER JOIN Produktkategori ON Produkter.ProduktID = Produktkategori.ProduktkategoriID WHERE Produktkategori.FK_Restaurant = @ButikID";
        cmd2.Parameters.AddWithValue("@ButikID", SqlDbType.Int).Value = Request.QueryString["ButikID"];
        Conn2.Open();
        var reader2 = cmd2.ExecuteReader();
        var prevId = 0;
        madkategorier kategori = null;
        while (reader2.Read())
        {
            var id = Convert.ToInt32(reader2["ProduktkategoriID"]);
            if (prevId != id)
            {
                prevId = id;
                kategori = new madkategorier();
                kategori.ProduktkategoriID = id;
                kategori.Navn = reader2["Navn"].ToString();
                kategori.produkter = new List<Produkter>();
                kategorier.Add(kategori);

            }

            var Produkter = new Produkter();
            Produkter.ProduktID = Convert.ToInt32(reader2["ProduktID"]);
            Produkter.Madnavn = Convert.ToString(reader2["Madnavn"]);
            kategori.produkter.Add(Produkter);
        }

        return kategorier;

men problemet der opstår nu er :

var Produkter = new Produkter();
            Produkter.ProduktID = Convert.ToInt32(reader2["ProduktID"]);
            Produkter.Madnavn = Convert.ToString(reader2["Madnavn"]);
            kategori.produkter.Add(Produkter);

bliver kun kørt 1 gang. Hvordan får jeg den kørt flere gange i en løkke?
Avatar billede arne_v Ekspert
05. juli 2016 - 18:48 #14
De linier boer da udfoeres en gang for hver raekke i query result.
Avatar billede Driton Seniormester
05. juli 2016 - 18:51 #15
Det gør de også, men hvad hvis der er flere til en kategori? forstår du?
Avatar billede arne_v Ekspert
05. juli 2016 - 18:53 #16
Hvis der er flere med samme kategori id, saa vil de alle blive tilfoejet til samme kategori objekt.

(eller det er ihvertfald meningen)
Avatar billede Driton Seniormester
05. juli 2016 - 18:59 #17
Underligt. Jeg får f.eks

Pizza
-Kødsaurce

-Is
-pepperoni

og en kolonne mangler med Daim tilhørende til is.

Så den skubber det ned :/

Jeg prøver lige at debugge det
Avatar billede Driton Seniormester
05. juli 2016 - 19:00 #18
Mine repeater ser også fine ud

<asp:repeater id="SubRepeater"  runat="server">
                      <itemtemplate>
<%#Eval("Navn") %></h3>
    <asp:repeater id="childRepeater" datasource='<%#Eval("Produkter") %>' runat="server">

        <itemtemplate>
          <h5><%# Eval("Madnavn") %></h5>
    </itemtemplate>
      </asp:repeater>
Avatar billede Driton Seniormester
05. juli 2016 - 19:07 #19
Det virker. Det var bare mig der havde refereret forkert
Avatar billede Driton Seniormester
05. juli 2016 - 19:08 #20
Tusind tak. De her småfejl kan give en hovedpine og gøre en i tvivl med hele sin kode
Avatar billede arne_v Ekspert
05. juli 2016 - 19:12 #21
Jeg tror at du paa sigt blive rmeget mere tilfreds med den maade at goere det paa fremfor DataSet.

Du kan lave en meget paenere opdeling af applikationen i lag.

Det vil ogsaa vaere langt nemmere at skifte til at bruge en ORM som EF eller NHibernate, da disse netop vil levere en saadan datamodel.
Avatar billede Driton Seniormester
05. juli 2016 - 19:16 #22
Tror jeg også, men er relativ ny til C# og asp.net.

F.eks jeg har lavet eksempler hvortil jeg ikke har vidst at det kaldes for noget bestemt og kender endnu ikke de mange måder at gøre ting på eller udvikle på. Synes et eller andet sted, at Java er nemmere, men ved ikke om det er fordi jeg har fået undervisning i skolen og det her læres selv. Fik 12 i C# i skolen, men jeg ved at det er ingenting. Sproget er hele tiden under udviklen.
Avatar billede Driton Seniormester
05. juli 2016 - 19:29 #23
Har konto til Lynda.com , men føler jeg får mere ud af programmere.
Avatar billede arne_v Ekspert
05. juli 2016 - 19:38 #24
Paa mange maader er det her det samme i Java og C#.

.NET DataReader = Java ResultSet
.NET DataSet = Java RowSet
.NET EF, NHibernate etc. = Java JPA, Hibernate etc.
ASP.NET repeater = Java taglibs (JSTL, JSF etc.)

Men mens jeg aldrig erindrer nogen sinde at have set nogen forsoege at bruge RowSet i Java, saa er det ret almindeligt at bruge DataSet i .NET.

Og det paa trods af at MS har anbefalet andet (EF) siden .NET 3.5/4.0.
Avatar billede arne_v Ekspert
05. juli 2016 - 19:42 #25
Et par smaa ting.

Jeg ville lave:

Produkter.ProduktID = Convert.ToInt32(reader2["ProduktID"]);
Produkter.Madnavn = Convert.ToString(reader2["Madnavn"]);

som:

Produkter.ProduktID = (int)reader2["ProduktID"];
Produkter.Madnavn = (string)reader2["Madnavn"];

fordi de i flere tilfaelde vil opdage og give en fejl hvis der er en uventet form for data.

Og saa var det maaske en ide at bruge den nye kompakte form for initialisering:

var Produkter = new Produkter() { ProduktID = (int)reader2["ProduktID"], Madnavn = (string)reader2["Madnavn"]);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester