Avatar billede simsen Mester
14. maj 2007 - 21:48 Der er 2 kommentarer og
1 løsning

Føre 2 selects ind i en datatable

Jeg har følgende kode, hvor jeg ved at begge select (har testet dem begge i access), giver henholdsvis 5 og 2 rækker retur.

Det jeg forsøger på er at oprette en tabel hvor jeg først putter den første select ind i. Jeg vil så efterfølgende bruge den samme tabel til at putte select nr. 2 ind i. Den fejler ved

                while (myReader2.Read())
                {
                    r = AItems.NewRow();

                    try
                    {
                        r["OpskriftId"] = (myReader["OpskriftId"]);


og siger "No data exists for the row/column" - jeg ved dog, at når jeg prøver selecten i access kommer den retur med 2 rækker.

Nogen der kan sige hvorfor?

min kode:

public Status GetSeekAdvancedSortMine(int BrugerId, string seekname, string seekingredienser, string seekfremgangsmaade, string KategoriId, string MaaltidId, string TemaId, string LandId, ref DataTable SeekAdvanced)
    {
        Status status = Status.Failure;

        DataRow r = null;
        DataTable AItems = new DataTable();

        //Konverterer KaktegoriID (indkommen string) til int
        //Hvis KategoriID.Index (=Vælg kategori teksten) = 0 skal den ikke sætte
        //teksten ind i Select statementen men istedet ignorere den ellers skal
        //den med
        int faktura = Convert.ToInt32(KategoriId);
        string fakturastring = "";
        if (faktura != 0)
        {
            fakturastring = "AND Opskrift.KategoriId = " + faktura;
        }

        //Konverterer MaaltidId (indkommen string) til int
        //Hvis MaaltidId.Index (=Vælg måltid teksten) = 0 skal den ikke sætte
        //teksten ind i Select statementen men istedet ignorere den ellers skal
        //den med
        int maaltid = Convert.ToInt32(MaaltidId);
        string maaltidstring = "";
        if (maaltid != 0)
        {
            maaltidstring = "AND Opskrift.MaaltidId = " + maaltid;
        }

        //Konverterer TemaId (indkommen string) til int
        //Hvis TemaId.Index (=Vælg tema teksten) = 0 skal den ikke sætte
        //teksten ind i Select statementen men istedet ignorere den ellers skal
        //den med
        int temaid = Convert.ToInt32(TemaId);
        string temastring = "";
        if (temaid != 0)
        {
            temastring = "AND Opskrift.TemaId = " + temaid;
        }

        //Konverterer LandId (indkommen string) til int
        //Hvis LandId.Index (=Vælg land teksten) = 0 skal den ikke sætte
        //teksten ind i Select statementen men istedet ignorere den ellers skal
        //den med
        int land = Convert.ToInt32(LandId);
        string landstring = "";
        if (land != 0)
        {
            landstring = "AND Opskrift.LandId = " + land;
        }

        try
        {
            AItems.Columns.Add(new DataColumn("OpskriftId", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("OpskriftNavn", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Ingredienser", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Fremgangsmaade", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Servering", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Points", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Dato", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Print", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("KategoriId", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("MaaltidId", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("TemaId", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("LandId", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("BrugerNavn", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("KategoriNavn", Type.GetType("System.String")));

            command.CommandText = "SELECT Opskrift.OpskriftId, Opskrift.OpskriftNavn, Opskrift.Ingredienser, Opskrift.Fremgangsmaade, Opskrift.Servering, Opskrift.Points, Opskrift.Dato, Opskrift.Print, Opskrift.KategoriId, Opskrift.MaaltidId, Opskrift.TemaId, Opskrift.LandId, Bruger.BrugerNavn, Kategori.KategoriNavn FROM (Kategori INNER JOIN Opskrift ON Kategori.KategoriId=Opskrift.KategoriId) INNER JOIN Bruger ON Opskrift.BrugerId=Bruger.BrugerId WHERE Opskrift.BrugerId = @BrugerId AND ((Opskrift.OpskriftNavn Like '%" + @seekname + "%') AND (" + @seekingredienser + ") AND (" + @seekfremgangsmaade + ") " + fakturastring + maaltidstring + landstring + temastring + ')';

            command.Parameters.Clear();
            command.Parameters.Add(new OleDbParameter("@BrugerId", BrugerId));
            command.Parameters.Add(new OleDbParameter("@seekname", seekname));
            command.Parameters.Add(new OleDbParameter("@seekingredienser", seekingredienser));
            command.Parameters.Add(new OleDbParameter("@KategoriId", KategoriId));
            command.Parameters.Add(new OleDbParameter("@MaaltidId", MaaltidId));
            command.Parameters.Add(new OleDbParameter("@LandId", LandId));
            command.Parameters.Add(new OleDbParameter("@TemaId", TemaId));
           

            OleDbDataReader myReader = command.ExecuteReader();

            //går gennem tabellen og lægger ind i rækker
            while (myReader.Read())
            {
                r = AItems.NewRow();

                try
                {
                    r["OpskriftId"] = (myReader["OpskriftId"]);
                    r["OpskriftNavn"] = (myReader["OpskriftNavn"]);
                    r["Ingredienser"] = (myReader["Ingredienser"]);
                    r["Fremgangsmaade"] = (myReader["Fremgangsmaade"]);
                    r["Servering"] = (myReader["Servering"]);
                    r["Points"] = (myReader["Points"]);
                    r["Dato"] = (myReader["Dato"]);
                    r["Print"] = (myReader["Print"]);
                    r["KategoriId"] = (myReader["KategoriId"]);
                    r["MaaltidId"] = (myReader["MaaltidId"]);
                    r["LandId"] = (myReader["LandId"]);
                    r["TemaId"] = (myReader["TemaId"]);
                    r["BrugerNavn"] = (myReader["BrugerNavn"]);
                    r["KategoriNavn"] = (myReader["KategoriNavn"]);
                }
                catch
                { }

                //Tilføjer rækken til datatable
                AItems.Rows.Add(r);
            }

            myReader.Close();

            //**********************************
               
            try
            {
                command.CommandText = "SELECT Opskrift.OpskriftId, Opskrift.OpskriftNavn, Opskrift.KategoriId, Opskrift.LandId, Opskrift.TemaId, Opskrift.MaaltidId, Opskrift.Tilberedningstid, Opskrift.BrugerId AS Opskrift_BrugerId, Opskrift.Kilde, Opskrift.PortionStk, Opskrift.Protein, Opskrift.Fedt, Opskrift.Kulhydrat, Opskrift.Pris, Opskrift.BilledeNavn, Opskrift.Ingredienser, Opskrift.Fremgangsmaade, Opskrift.Servering, Opskrift.Fedtfattig, Opskrift.AntalVisninger, Opskrift.Offentlig, Opskrift.Dato, Opskrift.Print, Opskrift.Points, Opskrift.AntalPersonerAfgivetPoints FROM Opskrift INNER JOIN GemteOpskrifter ON Opskrift.OpskriftId=GemteOpskrifter.OpskriftId WHERE GemteOpskrifter.BrugerId = @BrugerId2";
               
                //AND ((Opskrift.OpskriftNavn Like '%" + @seekname + "%') AND (" + @seekingredienser + ") AND (" + @seekfremgangsmaade + ") " + fakturastring + maaltidstring + landstring + temastring + ')';

                command.Parameters.Clear();
                command.Parameters.Add(new OleDbParameter("@BrugerId2", BrugerId));
                //command.Parameters.Add(new OleDbParameter("@seekname2", seekname));
                //command.Parameters.Add(new OleDbParameter("@seekingredienser2", seekingredienser));
                //command.Parameters.Add(new OleDbParameter("@KategoriId2", KategoriId));
                //command.Parameters.Add(new OleDbParameter("@MaaltidId2", MaaltidId));
                //command.Parameters.Add(new OleDbParameter("@LandId2", LandId));
                //command.Parameters.Add(new OleDbParameter("@TemaId2", TemaId));


                OleDbDataReader myReader2 = command.ExecuteReader();

                //går gennem tabellen og lægger ind i rækker
                while (myReader2.Read())
                {
                    r = AItems.NewRow();

                    try
                    {
                        r["OpskriftId"] = (myReader["OpskriftId"]);
                        r["OpskriftNavn"] = (myReader["OpskriftNavn"]);
                        r["Ingredienser"] = (myReader["Ingredienser"]);
                        r["Fremgangsmaade"] = (myReader["Fremgangsmaade"]);
                        r["Servering"] = (myReader["Servering"]);
                        r["Points"] = (myReader["Points"]);
                        r["Dato"] = (myReader["Dato"]);
                        r["Print"] = (myReader["Print"]);
                        r["KategoriId"] = (myReader["KategoriId"]);
                        r["MaaltidId"] = (myReader["MaaltidId"]);
                        r["LandId"] = (myReader["LandId"]);
                        r["TemaId"] = (myReader["TemaId"]);
                        r["BrugerNavn"] = (myReader["BrugerNavn"]);
                        r["KategoriNavn"] = (myReader["KategoriNavn"]);
                    }
                    catch
                    { }

                    //Tilføjer rækken til datatable
                    AItems.Rows.Add(r);

                    myReader2.Close();
                }
            }
            catch
            { }



            //***********************************

            //myReader.Close();           
            SeekAdvanced = AItems;
            status = Status.Success;
        }
        catch
        { }

        return status;
    }

mvh
simsen :-)
Avatar billede tomledk Nybegynder
14. maj 2007 - 22:08 #1
Muligvis vil du komme langt ved at lave en union mellem de to selects.

SELECT ...
FROM ...
union
SELECT ...
FROM ...

Det vil give dig din data i én datareader.

Et andet godt tip jeg lige må give dig, er i din try-catch. Du kan med fordel tilføje en finally som lukker din reader i stedet for at gøre det i din try. Det betyder at skulle der gå noget galt i din try, vil din reader blive lukket pænt under alle omstændigheder.

try
{
    // fill data from datareader
}
catch(Exception exp)
{
    // handle exception
}
finally
{
    // close datareader
}
Avatar billede simsen Mester
15. maj 2007 - 09:28 #2
Hejsa tomledk

Du har så ikke set de andre tråde, jeg har haft med det.... jeg har netop forsøgt mig med union men det gik galt..... i forbindelse med mine WHERE statements - den ville bare ikke tage dem med.

Derfor jeg har forsøgt mig ad denne vej her istedet.

mvh
simsen :-)
Avatar billede simsen Mester
15. maj 2007 - 10:33 #3
Opgiver l..... og søger kun på den ene tabel :-(
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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