Relaxed matching bei ADO & MySQL
-
Gegeben sei eine Adressdatenbank mit einem Suchfeld. Gesucht werden soll mit relaxed matching von MySQL ("nachname like %meier%" liefer meier, ameier, bmeir etc.).
Folgender Code:
Query = "SELECT "; Query += "haupt_id, neben_id, von_haupt_id, hauptname AS Kontakt, nachname AS Nachname, vorname AS Vorname, wohnort AS Wohnort, telefon AS Telefon "; Query += "FROM hauptkontakte, nebenadressen "; Query += "WHERE ( "; Query += "( "; Query += "(hauptkontakte.hauptname LIKE %:SUCHSTRING%) "; /*OR ";*/ Query += "(nebenadressen.nachname LIKE %:SUCHSTRING%) OR "; Query += "(nebenadressen.vorname LIKE %:SUCHSTRING%) OR "; Query += "(nebenadressen.bemerkungen LIKE %:SUCHSTRING%) OR "; Query += "(nebenadressen.schluesselwoerter LIKE %:SUCHSTRING%) "; Query += ") "; Query += "AND "; Query += "( "; Query += "(hauptkontakte.owner = :OWNER) AND "; Query += "(hauptkontakte.haupt_id = nebenadressen.von_haupt_id) "; Query += ") "; Query += ") "; Query += "ORDER BY hauptkontakte.hauptname, nebenadressen.nachname, nebenadressen.vorname ASC"; ADODataSet_Main->CommandText = Query; ADODataSet_Main->Parameters->ParamByName("OWNER")->Value = Mainformular->Benutzer; ADODataSet_Main->Parameters->ParamByName("SUCHSTRING")->Value = Edit_Suchstring->Text;Den Parameter OWNER kann ich hinzufügen, den Parameter SUCHSTRING hingegen nicht. Fehlermeldung: ADODataSet: Parameter 'SUCHSTRING' nicht gefunden
Es anscheinend an den Prozentzeichen vor :SUCHSTRING. Die brauche ich aber, da sie am Anfang und Ende des Feldinhaltes das relaxed matching einschalten.
Was muß ich tun?
-
Vielleicht setzt du den Code aus Zeile 23 ganz nach oben, damit der Wert aus dem
Edit im Query-String vorhanden ist.So kann die DB-Abfrage klappen, denke ich...
MfG kpeter
-
Ich würde es mit
...->ParamByName("SUCHSTRING")->Value = "%" + Edit_Suchstring->Text + "%";versuchen.
-
Fehler (mehrere) gefunden:
1. Als "Altlast" war OWNER als fester Parameter im ADODataSet eingetragen, daher kannte er nur den einen. Den habe ich rausgenommen, da die zur Laufzeit eingetragen werden.
2. Jansen lag richtig, ich muß die Prozentzeichen aus dem Query raus haben.
3. (und das Hauptproblem): Mehrfaches verwenden eines Parameters im Query ist anscheinend nicht zugelassen.
Ich habe das jetzt auf folgendes Code geändert und es funktioniert wie gewollt:
WideString Query; AnsiString Suche; Suche = "%" + Edit_Suchstring->Text + "%"; ADODataSet_Main->Active = false; Query = "SELECT "; Query += "haupt_id, neben_id, von_haupt_id, hauptname AS Kontakt, nachname AS Nachname, vorname AS Vorname, wohnort AS Wohnort, telefon AS Telefon "; Query += "FROM hauptkontakte, nebenadressen "; Query += "WHERE ( "; Query += "( "; Query += "(hauptkontakte.hauptname LIKE :SUCHSTRING1) OR "; Query += "(nebenadressen.nachname LIKE :SUCHSTRING2) OR "; Query += "(nebenadressen.vorname LIKE :SUCHSTRING3) OR "; Query += "(nebenadressen.bemerkungen LIKE :SUCHSTRING4) OR "; Query += "(nebenadressen.schluesselwoerter LIKE :SUCHSTRING5) "; Query += ") "; Query += "AND "; Query += "( "; Query += "(hauptkontakte.owner = :OWNER) AND "; Query += "(hauptkontakte.haupt_id = nebenadressen.von_haupt_id) "; Query += ") "; Query += ") "; Query += "ORDER BY hauptkontakte.hauptname, nebenadressen.nachname, nebenadressen.vorname ASC"; ADODataSet_Main->CommandText = Query; ADODataSet_Main->Parameters->ParamByName("OWNER")->Value = Mainformular->Benutzer; ADODataSet_Main->Parameters->ParamByName("SUCHSTRING1")->Value = Suche; ADODataSet_Main->Parameters->ParamByName("SUCHSTRING2")->Value = Suche; ADODataSet_Main->Parameters->ParamByName("SUCHSTRING3")->Value = Suche; ADODataSet_Main->Parameters->ParamByName("SUCHSTRING4")->Value = Suche; ADODataSet_Main->Parameters->ParamByName("SUCHSTRING5")->Value = Suche; ADODataSet_Main->Open();