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