Avatar billede simsen Mester
13. maj 2007 - 12:38 Der er 11 kommentarer og
1 løsning

Variabel i selectstatement i udvidet søgning

Hejsa,

Håber I har tålmodighed med mig....Jeg forstår det altså ikke :-(

Jeg vil lave en udvidet søgning, hvor jeg på siden har 3 tekstfelter og 4 dropdowns..... Alle felter kan udfyldes men skal ikke, derfor bruger jeg AND imellem mine selects. De to af de 3 tekststrenge skal laves sådan, at udfylder brugeren med mere end ét ord, skal der flere AND'er ind i den where statement.

Smider lidt flere points på, i håbet om, at I gider hjælpe mig igennem hele vejen....

Følgende kode virker til og med seekname/seekname2 ..... Nu vil jeg så have tilføjet seekingredienser (de andre ting putter jeg på, når den virker - altså én ting af gangen, så jeg kan følge med).

I får lige al koden....

Først selve funktionen, hvor jeg selecter:
public Status GetSeekAdvancedSortMine(int BrugerId, string seekname, string seekingredienser, string seekfremgangsmaade, string KategoriId, string MaaltidId, string TemaId, string LandId, ref DataTable SeekAdvancedMine)
    {
        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 kategori = Convert.ToInt32(KategoriId);
        //string kategoristring = "";
        //if (kategori != 0)
        //{
        //    kategoristring = "'AND Opskrift.KategoriId = " + kategori + "'";
        //}

        //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.OpskriftNavn Like '%" + @seekname + "%') AND (" + @seekingredienser + ") AND (" + @seekfremgangsmaade + ") " + fakturastring + maaltidstring + landstring + temastring + " ORDER By Points DESC";

            command.CommandText = "SELECT Opskrift.OpskriftId, Opskrift.OpskriftNavn, Opskrift.KategoriId, Opskrift.LandId, Opskrift.TemaId, Opskrift.MaaltidId, Opskrift.Tilberedningstid, 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, 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) = @BrugerId1)) AND (Opskrift.OpskriftNavn Like '%' + @seekname + '%') AND (@seekingredienser) UNION 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, Bruger.BrugerNavn, Kategori.KategoriNavn FROM Bruger INNER JOIN (Kategori INNER JOIN (Opskrift INNER JOIN GemteOpskrifter ON Opskrift.OpskriftId = GemteOpskrifter.OpskriftId) ON Kategori.KategoriId = Opskrift.KategoriId) ON Bruger.BrugerId = GemteOpskrifter.BrugerId WHERE (((GemteOpskrifter.BrugerId)= @BrugerId2)) AND (Opskrift.OpskriftNavn Like '%' + @seekname2 + '%') AND (@seekingredienser2)";


            command.Parameters.Clear();
            command.Parameters.Add(new OleDbParameter("@BrugerId1", BrugerId));
            command.Parameters.Add(new OleDbParameter("@seekname", seekname));
            command.Parameters.Add(new OleDbParameter("@seekingredienser", seekingredienser));
            //command.Parameters.Add(new OleDbParameter("@seekfremgangsmaade", seekfremgangsmaade));
            //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));

            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("@seekfremgangsmaade2", seekfremgangsmaade));
            //command.Parameters.Add(new OleDbParameter("@KategoriId2", KategoriId));

            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();
            SeekAdvancedMine = AItems;
            status = Status.Success;
        }
        catch
        { }

        return status;
    }

Så koden, hvor jeg kalder funktionen:

protected void btnAdvancedSeek_Click(object sender, EventArgs e)
    {
        int userid = Convert.ToInt32(Session[DBConnection.SessionUserId]);

        hidepanels();

        SoegApi soegapi = new SoegApi();

        //Splitter Ingredienser tekst strengen op
        string tekst = txtIngredienser.Text;

        string strSQLstatementIngredienser = "";

        string[] a = tekst.Split(new char[] { ' ' });

        for (int i = 0; i < a.Length; i++)
        {
            if (i == a.Length - 1)
            {
                strSQLstatementIngredienser += "Ingredienser like '%" + a[i] + "%'";
            }
            else
            {
                strSQLstatementIngredienser += "Ingredienser like '%" + a[i] + "%' AND ";
            }
        }       

        //Splitter Fremgangsmåde tekst strengen op
        string tekstFremgangsmaade = txtFremgangsmaade.Text;

        string strSQLstatementFremgangsmaade = "";

        string[] b = tekstFremgangsmaade.Split(new char[] { ' ' });

        for (int j = 0; j < b.Length; j++)
        {
            if (j == b.Length - 1)
            {
                strSQLstatementFremgangsmaade += "Fremgangsmaade like '%" + b[j] + "%'";
            }
            else
            {
                strSQLstatementFremgangsmaade += "Fremgangsmaade like '%" + b[j] + "%' AND ";
            }
        }

        //Her sætter jeg kategori til at være lig med SelectedValue
        //Hvis ikke valgt noget, sættes den til 0
        string kategori = "";
        if (ddlKategori.SelectedIndex != 0)
        {
            kategori = ddlKategori.SelectedValue;
        }
        else
        {
            kategori = "";
        }

        //Her sætter jeg måltid til at være lig med SelectedValue
        //Hvis ikke valgt noget, sættes den til 0
        string maaltid = "";
        if (ddlMaaltid.SelectedIndex != 0)
        {
            maaltid = ddlMaaltid.SelectedValue;
        }
        else
        {
            maaltid = "";
        }

        //Her sætter jeg tema til at være lig med SelectedValue
        //Hvis ikke valgt noget, sættes den til 0
        string tema = "";
        if (ddlTema.SelectedIndex != 0)
        {
            tema = ddlTema.SelectedValue;
        }
        else
        {
            tema = "";
        }

        //Her sætter jeg land til at være lig med SelectedValue
        //Hvis ikke valgt noget, sættes den til 0
        string land = "";
        if (ddlLande.SelectedIndex != 0)
        {
            land = ddlLande.SelectedValue;
        }
        else
        {
            land = "";
        }

        //Henter søge resultatet ud
        DataTable SeekAdvanced = null;
        if (soegapi.GetSeekAdvancedSortMine(userid, txtNavn.Text, strSQLstatementIngredienser, strSQLstatementFremgangsmaade, kategori, maaltid, tema, land, ref SeekAdvanced) == Status.Success)

        {
            if (SeekAdvanced.Rows.Count > 0)
            {
                panSeekAdvanced.Visible = true;
                panAdvancedSearchPositive.Visible = true;
                panAdvancedSearchNegative.Visible = false;
            }
            else
            {
                panSeekAdvanced.Visible = true;
                panAdvancedSearchPositive.Visible = false;
                panAdvancedSearchNegative.Visible = true;
            }

            repAdvancedSeek.DataSource = SeekAdvanced.DefaultView;
            repAdvancedSeek.DataBind();
        }

        panSeekAdvanced.Visible = true;

        soegapi.Dispose();
    }

Altså - det jeg mangler nu - er at når jeg taster noget ind i tekstfeltet til seekingredienser (i dette tilfælde sukker), skal den søge på kolonnen Ingredienser og hente alle rækker ud, der har det i sig men kun med BrugerId = 1.....

Lige nu kommer alle rækker ud, der har BrugerId = 1. Det er en fejl, da der kun er én række der har sukker i kolonnen ingredienser.

Håber der er nogen, der kan hjælpe mig her.......

mvh
simsen
Avatar billede neoman Novice
13. maj 2007 - 13:49 #1
Det er da noget af en bid at sluge (med eller uden sukker), hehe :)

Jeg er ikke helt med på problemet - er det din SELECT som får de rigtige data, men henter noget forkert ? Og dermed skal laves om ? For den er en kende for komplex til mig , når jeg ikke  kan sidde og lege i query-builderen ( i access f.eks.) :)

Eller er der forkerte parameterværdier i din SELECT ?
Avatar billede simsen Mester
13. maj 2007 - 13:57 #2
Hejsa neoman

Ja det er en bid at sluge........og bagte også gerne en kage, kan du hjælpe mig (med sukker) :-)

Jeg tror ikke det er min select, det er galt med. Jeg tror (uden at vide det - er altså knap så god ...endnu) - at det er når jeg putter det ind i strengen. Du ved i den anden tråd hvor dr_chaos skrev, at jeg skulle lave mine dobbelt " om til ' .... Problemet er, at jeg jo ikke selv i det her tilfælde sætter plingerne. Dem sætter systemet for mig.

For når jeg læser select delen (kører musen henover "command.Parameters.Add(new OleDbParameter("@seekingredienser", seekingredienser));" linien) mener jeg, at kunne læse, at den skriver det rigtigt - nemlig

"Ingredienser like '%sukker%'"

- men som du kan se - har den de dobbelt plinger med.......og jeg aner ikke, hvordan jeg slipper af med dem......

mvh
simsen :-)
Avatar billede neoman Novice
13. maj 2007 - 14:10 #3
Betyder det at du i din parameter f.eks seeksfremgangsmåde, i stedet for selve parameterværdierne, at du prøver at adde SQL stumper ? Aner ikke om det ville fungere :) - det gør det tydeligvis ikke..

Jeg tror at det ville være nemmere blot at adde den pågældende stump på den rette plads i din SELECT - siden du jo nu har fat i værdierne mens du skriver den ! :-)

Hvis du nu vil have parametre, fint nok - så er det "same procedure as last year" :-)
Tilføl sql-stumpet på den rette plads i din SELECT, med placeholder som "?" eller navn, og tilsvarende parameter defineret på samme plads i følgen
Avatar billede dr_chaos Nybegynder
13. maj 2007 - 14:44 #4
Hvis du bruger sql så lav det om til en stored procedure.

Så kan du sætte nødvendige plinger om dine variabler:
SET @seekname='%' + @seekname + '%
Avatar billede dr_chaos Nybegynder
13. maj 2007 - 14:44 #5
sql server mener jeg.
Avatar billede dr_chaos Nybegynder
13. maj 2007 - 14:49 #6
for at simplificerer din søgning kan du gøre hvad jeg plejer:

SELECT * FROM tabel t WHERE
t.id LIKE ISNULL(@id, t.id) AND t.text LIKE ISNULL(@text, t.text)
På den måde for du en optimeret søgning som gør at man slipper for mange or's og and's
Avatar billede neoman Novice
13. maj 2007 - 14:49 #7
jeg mener han kører access :)
Avatar billede dr_chaos Nybegynder
13. maj 2007 - 15:01 #8
Det er en kvinde :)
Avatar billede neoman Novice
13. maj 2007 - 15:04 #9
ooooooopz :-)
Avatar billede simsen Mester
13. maj 2007 - 18:01 #10
Så er jeg retur fra børneføds'dag.....

neoman
Ja jeg adder sql stumper - og det fungerer glimrende når jeg ikke har en UNION

kode for uden UNION:
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.OpskriftNavn Like '%" + @seekname + "%') AND (" + @seekingredienser + ") AND (" + @seekfremgangsmaade + ") " + fakturastring + maaltidstring + landstring + temastring + " ORDER By Points DESC";

Og ja, jeg er en kvinde.... ;-)

dr_chaos

Gider du forklare ISNULL(@id, t.id) - kan godt læse at ISNULL= er nul og det må så være på variablinputtet id der spørges - men hvad med t.id?

Og ja - det er en access database

mvh
simsen :-)
Avatar billede dr_chaos Nybegynder
13. maj 2007 - 18:58 #11
Jeg troede du brugte sql server fordi så kan man lave ISNULL på flere variabler.

I ISNULL(@id, t.id) så ville det se på om @id er null. Hvis den er vil den bruge t.id som er id feltet i tabellen.
Derved får man lavet en effektiv query.
Avatar billede simsen Mester
14. maj 2007 - 21:43 #12
Lukker her - har måske fundet en anden vej....som jeg dog også skal have hjælp til *suk*
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