Laden...

Suchalgorithmus

Erstellt von alex309 vor 17 Jahren Letzter Beitrag vor 17 Jahren 5.514 Views
A
alex309 Themenstarter:in
91 Beiträge seit 2006
vor 17 Jahren
Suchalgorithmus

Hallo,

ich habe 4 Felder in denen man etwas eintragen kann.
Nun will ich einen Suchalgorithmus schreiben.

Wenn in Feld 1 etwas eingetragen wurde, aber in 2, 3 und 4 nicht, suche nach 1.
Wenn in Feld 2 etwas eingetragen wurde, aber in 1, 3 und 4 nicht, suche nach 2.
Wenn in Feld 1 und Feld 2 etwas eingetragen wurde, aber in 3 und 4 nicht, suche nach 1 und 2.
usw.
habe mir hier 14 Möglichkeiten zurechtgebastelt, die alle Eventuallitäten abfängt.
Ist so eine "Suchmachine" schon irgendwo vorhanden oder muss ich mir das selbst schreiben?
mfg
alex

I
39 Beiträge seit 2006
vor 17 Jahren

sicher das du nur 14 möglichkeiten hast?
ich würde nämlich sagen du hast vergessen, dass auch in keinen feld was stehen kann oder das in allen feldern was steht.
außerdem verstehe ich nicht was du machen willst.

A
alex309 Themenstarter:in
91 Beiträge seit 2006
vor 17 Jahren

ja klar, die 2 möglichkeiten habe ich vergessen! 🙂

erklärung:

ich habe vier dropdownlisten, bei denen man was auswählen kann.
je nach auswahl, soll er mir eine xml-datei durchsuchen und das ergebnis anzeigen.

I
39 Beiträge seit 2006
vor 17 Jahren

und wozu brauchst du 4 listen?
soll es denn so sein, dass wenn in mehreren dropdownlisten was steht er nacheinander nach den begriffen suchen soll, oder liege ich da falsch?

achso und die Möglichkeiten kriegt man immer mit n2 raus (42 = 16)

A
alex309 Themenstarter:in
91 Beiträge seit 2006
vor 17 Jahren

nicht nacheinander, sonder gleichzeitig

  
  <user>
    <hersteller>Mercedes</hersteller>
    <land>Deutschland</land>
    <ort>Kölleda</ort>
    <gruppe>DaimlerChrysler</gruppe>
    <typ1 />
    <typ2 />
    <typ3 />
    <typ4 />
    <typ5 />
    <adresse />
    <telefon_fax />
    <werksbezeichnung />
  </user>

in den 4 listen kann man hersteller, land, ort und gruppe auswählen.
je nachdem was ausgewählt wurde, soll er das ergebnis anzeigen.
wenn in hersteller und ort was steht, dann soll er nach dem datensatz suchen und ihn dann anzeigen.
wenn in land und gruppe was steht, dann....

3.825 Beiträge seit 2006
vor 17 Jahren

Hallo Alex,

die "Suchmaschine" heisst SQL und kann das was Du willst :


string sqlstr = "select * from datei where ";
if (textBox1.Text =! "") sqlstr += " wert1 = '" + textBox1.Text + "' and ";
if (textBox2.Text =! "") sqlstr += " wert2 = '" + textBox2.Text + "' and ";
if (textBox3.Text =! "") sqlstr += " wert3 = '" + textBox3.Text + "' and ";
if (textBox4.Text =! "") sqlstr += " wert4 = '" + textBox4.Text + "' and ";
if (textBox1.Text+textBox2.Text+textBox3.Text+textBox4.Text == "")
     sqlstr = "select * from datei";
else
     sqlstr = sqlstr.SubString(0,sqlstr.Length-5);
...

Ich würde noch eine Sortierung nach dem Suchwert einbauen.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

484 Beiträge seit 2006
vor 17 Jahren

So was ist doch nicht schwer.



public void Search(string a, string b, string c, string d)
{
  // Nehmen wir mal an das der Defaultwert bei SelectedIndex[0] string.Empty ist
  
  if(!IsNullOrEmpty(a))
  {
     // Mach was mit a
  }
  // ... usw dann auf xml loslassen

 }

Jörg

A
alex309 Themenstarter:in
91 Beiträge seit 2006
vor 17 Jahren

habe ja keine sql-datenbank, sondern eine xml-datei.

und wird da nicht gemeckert, wenn nur in textbox1 was steht und der abfragestring als letztes wort das "and" hat?


select * from datei where wert1="Dänemark" and

aber ich denke mal das wäre kein problem das ohne "and" zu schreiben.

aber wie gesagt ist eben eine xml-datei.

A
alex309 Themenstarter:in
91 Beiträge seit 2006
vor 17 Jahren

@jörg

ja da hätte ich ja meine 16 Möglichkeiten und dementsprechend auch meine
16 Suchalgorithmen.
ich dachte mir nur ob es auch etwas kürzer geht 🙂
mfg
alex

484 Beiträge seit 2006
vor 17 Jahren

Original von alex309
ja da hätte ich ja meine 16 Möglichkeiten und dementsprechend auch meine
16 Suchalgorithmen.
ich dachte mir nur ob es auch etwas kürzer geht 🙂

Es sind nur 4 !


/**********************
AUS DEM BAUCH UNTESTED
\***********************/

public void Search(string a, string b, string c, string d)
{
  // Nehmen wir mal an das der Defaultwert bei SelectedIndex[0] string.Empty ist
  StringBuilder MeineSuche = new StringBuilder();
  MeineSuche.Append ("/user/[");

  bool Added  = false;
  if(!IsNullOrEmpty(a))
  {
     MeineSuche.AppendFormat("Hersteller ='{0}', a);
     Added = true; 
  }
  if(!IsNullOrEmpty(b))
  {
      if(Added)
        MeineSuche.Append(" AND ");
     
      MeineSuche.AppendFormat("ort ='{0}', b);
      Added = true;        
    }

// Den Rest machst Du schon

MeineSuche.Append("]");
XmlDocument doc = new XmlDocument();
XmlTextReader reader = new XmlTextReader("c:\\dein.xml");
reader.Read();      
doc.Load(reader);
//XPath
XmlNodeList NodeList = doc.SelectNodes(MeineSuche.ToString())
StringBuilder Builder = new StringBuilder();
Builder.Append("<OUTPUT>");

foreach (XmlNode node in NodeList)
{
        Builder.Append(node.OuterXml);
}
Builder.Append("</OUTPUT>");
// Rest machst Du schon
}


Gruß Jörg

3.825 Beiträge seit 2006
vor 17 Jahren

Alex : Mit "sqlstr = sqlstr.SubString(0,sqlstr.Length-5);" schneide ich das letzte "and" ab.

Raffiniert nicht ?

😉

XML eventuell in eine Dataset einlesen und dann mit dort mit SQL selektieren.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

A
alex309 Themenstarter:in
91 Beiträge seit 2006
vor 17 Jahren

@bernd
habe es bemerkt! 🙂

@jörg
ok, dass muss ich mir dann doch genauer anschauen 😉

ich mach mal meine Version fertig und werde mich dann deinem code wittmen.
ich gebe bescheid, wenn ich beide durchhabe.

danke für eure hilfe

mfg
alex

484 Beiträge seit 2006
vor 17 Jahren

Original von BerndFfm

  
string sqlstr = "select * from datei where ";  
if (textBox1.Text =! "") sqlstr += " wert1 = '" + [B]textBox1.Text [/B]+ "' and ";  
if (textBox2.Text =! "") sqlstr += " wert2 = '" + textBox2.Text + "' and ";  
if (textBox3.Text =! "") sqlstr += " wert3 = '" + textBox3.Text + "' and ";  
if (textBox4.Text =! "") sqlstr += " wert4 = '" + textBox4.Text + "' and ";  
if (textBox1.Text+textBox2.Text+textBox3.Text+textBox4.Text == "")  
     sqlstr = "select * from datei";  
else  
     sqlstr = sqlstr.SubString(0,sqlstr.Length-5);  
...  
  

@Bernd das riecht aber nach SQL Injection


textBox1.Text = " ' DELETE TABELLE --      "

Nur mal so am Rande

Jörg

A
alex309 Themenstarter:in
91 Beiträge seit 2006
vor 17 Jahren

das würde aber bei diesem beispiel nicht funktionieren, da ich eine dropdownliste benutze und da nichts reinschreiben kann.
mfg
alex

3.825 Beiträge seit 2006
vor 17 Jahren

Hallo Jörg,

ja, das stimmt. Es ist besser mit Argumenten zu arbeiten oder so einige Zeichen rauszufiltern. Mir ging es eher ums Prinzip.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

484 Beiträge seit 2006
vor 17 Jahren

Hallo Bernd,

ums Prinzip ging es mir auch, denn wenn ich z.B. Software teste ist es das erste was ich mache 🙂

Und wenn Du z.B. Projektmitarbeitern, Praktikanten, Azubis
diese Vorgehensweise zeigst und die sich das aneignen - dann muss man jedesmal den SecuritySheriff spielen.

Von daher halte ich es für angebracht immer SecureCode zu zeigen, gerade weil sich auch hier im Forum Newbies aufhalten.

Gruß Jörg

T
512 Beiträge seit 2006
vor 17 Jahren

Würde mich ehrlich gesagt wundern, wenn man mit dem Select Befehl vom DataSet eine Tabelle löschen könnte 😉

e.f.q.

Aus Falschem folgt Beliebiges

484 Beiträge seit 2006
vor 17 Jahren

Original von Traumzauberbaum
Würde mich ehrlich gesagt wundern, wenn man mit dem Select Befehl vom DataSet eine Tabelle löschen könnte 😉

Dann wundere Dich mal und schreibe Dir doch mal ne einfache Form oder Page
und schreibe da mal im Init oder wo Du willst das hier rein.


// Wir löschen jetzt mal die Tabelle und nicht die Daten der Tabelle
// und wir verwenden nicht master.xp_cmdshell womit wir ja noch mehr anstellen
// könnten z.b. Einen Share anlegen net tralala 
// Alles natürlich vorausgesetzt wir haben die dementsprechenden Rechte am SQL-Server

// Für [Tabelle1]  kannst Du ja mal Eure KundendatenTabelle nehmen
// Für den Catalog=Killit nimmst Du dann Eure Produktivdatenbank

// Erstelle besser ne TestDb :) 

string sql = "Select * from [Tabelle1] where Username = '' DROP TABLE [Tabelle1] --";
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = "Data Source=DeineDatenbank;Initial Catalog=Killit;Integrated Security=True";
        SqlDataAdapter da = new SqlDataAdapter(sql,conn);
        DataSet ds = new DataSet();
        da.Fill(ds,"User");


Happy Coding

Jörg

A
alex309 Themenstarter:in
91 Beiträge seit 2006
vor 17 Jahren

ich denke doch, dass er nicht eine Datenbank meinte sondern ein DataSet

ist wohl ein missverständniss 🙂

484 Beiträge seit 2006
vor 17 Jahren

Gut, Bernd sprach von Datenbank, daher mein Hinweis auf SQLInjection
Das Thema heist denn in deinem Beispiel, also wenn es keine DropDowns wären,
XmlInjection die auch einiges erlaubt 🙂

Aber das wäre glaube ich mal einen Artikel wert.

Happy Coding
Jörg