Avatar billede kongen72 Nybegynder
10. juni 2010 - 21:27 Der er 13 kommentarer

Søgning på flere kriterier

Hej

Håber i kan hjælpe mig med en multi søg! Er lidt lost i denne del!

Har følgende kriterier på min søgeside:

Brugernavn
Alder - f.eks: Søg mellem 21år og 43år
Højde
Vægt
By

txtBrugernavn.Text, txtAlderFra.Text, txtAlderTil.Text, txtHoejde.Text, txtVaegt.Text, txtBy.Text og selvfølgelig knappen btnSoeg

Lige nu har jeg følgende: -Sikkert en masse ting som ikke er helt korrekt, håber i kan hjælpe til at gøre det bedre.

Sql:
SELECT * FROM Profiler WHERE (UserName LIKE '%' + @Search + '%' OR AgeFrom LIKE '%' + @Search + '%' OR AgeTo LIKE '%' + @Search + '%' OR Height LIKE '%' + @Search + '%' OR Weight LIKE '%' + @Search + '%' OR City LIKE '%' + @Search + '%')

Søge siden:
    protected void btnSoeg_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/SoegeResultater.aspx?UserName=" + txtUsername.Text + "&AgeFrom=" + txtAgeFrom.Text + "&AgeTo=" + txtAgeTo.Text + "&Weight=" + txtWeight.Text + "&Height=" + txtHeight.Text + "&City=" + txtCity.Text);
    }

Søge-resultat siden:
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            if (Request.QueryString["UserName"] != null)
            {
                ListView1.DataSource = profiles.GetDataBySearch(Request.QueryString["UserName"]);
                ListView1.DataBind();
            }
        }
        else
        {
            litStatus.Text = "Denne søgning kunne ikke gennemføres";
        }
    }


Det er hvad jeg har indtil videre, den søger kun på Brugernavnet. Vil gerne have den til at søge på personer som matcher kriterierne. Hvis ikke søgningen kan gennemføres skal den søge noget tæt på kriterierne.!

Håber virkelig en eller flere kan hjælpe!


Tak på forhånd!
Avatar billede arne_v Ekspert
10. juni 2010 - 21:40 #1
For form felt - query logikken saa lavede jeg et par eksempler til et andet spoergsmaal for en maaned siden, som nok vil give nogle ideer.


using System;
using System.Data;
using System.Data.SqlClient;

namespace E
{
    public class Program
    {
        public static void DynQuery(String f1, String f2)
        {
            using(SqlConnection con = new SqlConnection(@"Server=ARNEPC3\SQLEXPRESS;Database=Test;Integrated Security=SSPI"))
            {
                con.Open();
                SqlCommand cmd = new SqlCommand();
                string sql = "SELECT * FROM t1";
                bool first = true;
                if(f1 != "")
                {
                    sql += (first ? " WHERE" : " AND");
                    sql += " f1 = @f1";
                    cmd.Parameters.Add("@f1", SqlDbType.Int);
                    cmd.Parameters["@f1"].Value = int.Parse(f1);
                    first = false;
                }
                if(f2 != "")
                {
                    sql += (first ? " WHERE" : " AND");
                    sql += " f2 = @f2";
                    cmd.Parameters.Add("@f2", SqlDbType.VarChar, 50);
                    cmd.Parameters["@f2"].Value = f2;
                    first = false;
                }
                cmd.Connection = con;
                cmd.CommandText = sql;
                SqlDataReader rdr = cmd.ExecuteReader();
                while(rdr.Read())
                {
                    Console.WriteLine(rdr[0] + " " + rdr[1]);
                }
                rdr.Close();
            }
        }
        public static void Main(string[] args)
        {
            DynQuery("", "");
            DynQuery("2", "");
            DynQuery("", "BB");
            DynQuery("2", "BB");
        }
    }
}



using System;
using System.Data;
using System.Data.SqlClient;

namespace E
{
    public class Program
    {
        public static void DynQuery(String f1, String f2)
        {
            using(SqlConnection con = new SqlConnection(@"Server=ARNEPC3\SQLEXPRESS;Database=Test;Integrated Security=SSPI"))
            {
                con.Open();
                SqlCommand cmd = new SqlCommand("SELECT * FROM t1 WHERE f1 = ISNULL(@f1,f1) AND f2 = ISNULL(@f2,f2)", con);
                cmd.Parameters.Add("@f1", SqlDbType.Int);
                cmd.Parameters["@f1"].Value = (f1 != "") ? (object)int.Parse(f1) : DBNull.Value;
                cmd.Parameters.Add("@f2", SqlDbType.VarChar, 50);
                cmd.Parameters["@f2"].Value = (f2 != "") ? (object)f2 : DBNull.Value;
                SqlDataReader rdr = cmd.ExecuteReader();
                while(rdr.Read())
                {
                    Console.WriteLine(rdr[0] + " " + rdr[1]);
                }
                rdr.Close();
            }
        }
        public static void Main(string[] args)
        {
            DynQuery("", "");
            DynQuery("2", "");
            DynQuery("", "BB");
            DynQuery("2", "BB");
        }
    }
}
Avatar billede arne_v Ekspert
10. juni 2010 - 21:41 #2
"tæt på kriterierne" er noget vanskeligt at implementere - du kan starte med at definere hvad det betyder.

Mener du at kun N-1  ud af de N kriterier skal bruges?

Mener du at tekst sammenligning skal ignorere forskellige stavemaader som lyder ens?
Avatar billede Syska Mester
10. juni 2010 - 21:49 #3
kongen72#
Du kan sprøge google om råd her ... det er de rimelig gode til :-), altså det med "lyder som" :-)
Avatar billede kongen72 Nybegynder
11. juni 2010 - 00:27 #4
Hej Arne og tak for din tilbagemelding! :-)

Er der mulighed for, at du kan flette din kode ind i min? -Så får jeg forhåbenlig en større forståelse af din koden. :-/

Lige nu ligner det russisk! ;-)


-med "tæt på kriterierne" mener jeg. At hvis man søger på f.eks. (brugernavn)Peter og (by)Slagelse. og der ingenting finder på Peter, så får du noget tæt på, som Peder fra Slagelse. Hvis det giver lidt menning!?


Tak
Avatar billede Syska Mester
11. juni 2010 - 00:45 #5
Ja, men det er ikke nemt ... dem findes der jo mange af.

Peter/Peter, Mikael/Michael, Te/The, etc. tror bare du må lære folk at stave rigtigt :-)

                if(txtHeight.Text != "")
                {
                    sql += (first ? " WHERE" : " AND");
                    sql += " Height = @height";
                    cmd.Parameters.Add("@height", SqlDbType.Int);
                    cmd.Parameters["@height"].Value = int.Parse(txtHeight.Text);
                    first = false;
                }

                if(txtCity.Text != "")
                {
                    sql += (first ? " WHERE" : " AND");
                    sql += " Height = @city";
                    cmd.Parameters.Add("@city", SqlDbType.VarChar, 250); // eller hvordan du nu gemmer by navnet
                    cmd.Parameters["@city"].Value = txtCity.Text;
                    first = false;
                }

Så burde du have din sql string, du kan sætte sammen med exec mod DB'en.

mvh
Avatar billede kongen72 Nybegynder
11. juni 2010 - 15:04 #6
Takker buzzzz!

tror du har ret!, -ligger en ordbog ud!

Har lige nogle spørgsmål, jeg håber du kan løse! :-)

Ser dette fint ud?
SoegeResultat.aspx:
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
                        using (SqlConnection con = new SqlConnection(@"ConnectionString"))
            {
                con.Open();
                SqlCommand cmd = new SqlCommand();
                string sql = "SELECT * FROM Profiles";
                bool first = true;

                if (txtUserName.Text != "")
                {
                    sql += (first ? " WHERE" : " AND");
                    sql += " UserName = @UserName";
                    cmd.Parameters.Add("@UserName", SqlDbType.NVarChar);
                    cmd.Parameters["@UserName"].Value = int.Parse(txtUserName.Text);
                    first = false;
                }

                if (txtWeight.Text != "")
                {
                    sql += (first ? " WHERE" : " AND");
                    sql += " Weight = @Weight";
                    cmd.Parameters.Add("@Weight", SqlDbType.NVarChar);
                    cmd.Parameters["@Weight"].Value = txtWeight.Text;
                    first = false;
                }

                if (txtHeight.Text != "")
                {
                    sql += (first ? " WHERE" : " AND");
                    sql += " Height = @Height";
                    cmd.Parameters.Add("@Height", SqlDbType.NVarChar);
                    cmd.Parameters["@Height"].Value = txtHeight.Text;
                    first = false;
                }

                if (txtCity.Text != "")
                {
                    sql += (first ? " WHERE" : " AND");
                    sql += " City = @City";
                    cmd.Parameters.Add("@City", SqlDbType.NVarChar);
                    cmd.Parameters["@City"].Value = txtCity.Text;
                    first = false;
                }
                cmd.Connection = con;

                cmd.CommandText = sql;
                SqlDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    Console.WriteLine(rdr[0] + " " + rdr[1]);
                }
                rdr.Close();
            }
        }
    }


-Skal min sql-query ligne den, som jeg postede i starten?
-Hvordan får jeg fat i mine tekstbokse - txtHeigth osv.. Skal vel forbindes med querystring ud fra mine indtastninger på søgesiden?
-Hvordan kan jeg få skrevet mit søgeindhold ud i et listview?

håber ikke det var for mange ting på én gang.
Avatar billede arne_v Ekspert
11. juni 2010 - 15:56 #7
Hvis det er en GUI eller web app, saa skal nok nok ikke udskrive resultatet til console, men ellers ser det vel rimeligt ud.

Hvis du vil tillade wildcards skal der bruges LIKE fremfor =.
Avatar billede arne_v Ekspert
11. juni 2010 - 15:58 #8
Hvis du vil have data vist i et ListView, saa tror jeg at du kan assigne din SqlDataReader til ListView'ets DataSource property.
Avatar billede arne_v Ekspert
11. juni 2010 - 16:00 #9
"lyder som" er som sagt et vanskeligt problem.

SQLServer har saa vidt jeg ved support for SOUNDEX, men det virker ikke super godt - specielt ikke med dansk !

Hvis du vil lave den slags, saa vil mit forslag vaere at laese:

database---SqlDataReader---List<X> med alle---List<X> med dem du vil have

d.v.s. at filtrere i applikationen.
Avatar billede arne_v Ekspert
11. juni 2010 - 16:04 #10
Til inspiration lidt kode fra lageret:

    public static class Fonetic
    {
        public static string Convert(string s)
        {
            string s2 = s.ToLower();
            s2 = s2.Replace("æ", "ae");
            s2 = s2.Replace("ø", "oe");
            s2 = s2.Replace("å", "aa");
            s2 = s2.Replace("u", "v");
            s2 = s2.Replace("ph", "f");
            s2 = s2.Replace("ch", "k");
            s2 = Regex.Replace(s2, "([gkrst])(h)", "$1");
            s2 = s2.Replace("ds", "s");
            s2 = s2.Replace("nd", "n");
            s2 = s2.Replace("c", "k");
            s2 = s2.Replace("d", "t");
            s2 = s2.Replace("w", "v");
            s2 = s2.Replace("z", "s");
            s2 = s2.Replace("x", "s");
            StringBuilder sb = new StringBuilder();
            sb.Append(s2[0]);
            for(int i = 1; i < s2.Length & sb.Length <= 4; i++) {
                if("aeiouyæøå".IndexOf(s2[i]) < 0
                  && s2[i] != s2[i-1]) {
                    sb.Append(s2[i]);
                }
            }
            return sb.ToString();
        }
    }

kan bruges som:

if(Fonetic.Convert(s1) == Fonetic.Convert(s2)) {
    // s1 og s2 ligner muligvis hinanden
}
Avatar billede kongen72 Nybegynder
11. juni 2010 - 16:32 #11
hvad med if (txtUserName.Text != "")! -Skal jeg have den fra noget querystring fra søgesiden. Eller hvordan hænger det sammen?

Skal SQL-queryen være:

SELECT * FROM Profiler WHERE (UserName LIKE '%' + @Search + '%' OR AgeFrom LIKE '%' + @Search + '%' OR AgeTo LIKE '%' + @Search + '%' OR Height LIKE '%' + @Search + '%' OR Weight LIKE '%' + @Search + '%' OR City LIKE '%' + @Search + '%')


Hvad er wildcards?

Mener du at, LIKE skal indsættes således:

protected void btnSoeg_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/SoegeResultater.aspx?UserNameLIKE" + txtUsername.Text + "&AgeFromLIKE" + txtAgeFrom.Text + "&AgeToLIKE" + txtAgeTo.Text + "&WeightLIKE" + txtWeight.Text + "&HeightLIKE" + txtHeight.Text + "&CityLIKE" + txtCity.Text);
    }


Hvis jeg vil sortere personernes alder (f.eks: søge mellem 28 og 73). Hvordan vil koden så se ud?
Avatar billede arne_v Ekspert
11. juni 2010 - 17:10 #12
Hm.

Jeg troede at vi var gaaet vaek fra den konstruktion for adskillige indlaeg siden.
Avatar billede janus_007 Nybegynder
12. juni 2010 - 11:45 #13
Jeg bliver altid nervøs når jeg ser den slags kode der. Kommer til at tænke på hvor meget bras der mon ligger og flyder rundt, fordi folk ikke gider gøre tingene korrekt fra starten.

kongen72, jeg vil mene du skal sætte dig bedre ind i .NET istedet for at klaske spaghetti på bordet. Du vil opleve fantastiske sider og .NET og finde ud af hvor nemt det egentlig er hvis du følger nogle simple standarder. Det er ikke min mening at genere dig, håber du tager det positivt til dig :) OG FØLG SÅ NOGLE AF DE RÅD ARNE KOMMER MED *GG*

"Fight bad code"
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