C# MySQL - LIKE mit Parametern

Thaxll'ssillyia

Captain
Registriert
Dez. 2007
Beiträge
3.568
Hallo Community!

Ich programmiere erstmals mit einer mysql-Datenbank und hab da mit dem LIKE-Befehl ein Problem.
Ich benutze den .NET-Connector.

Meine Datenbank hat eine Tabelle 'rechner', wo die erste Spalte 'Inventarnummer' heißt.
Derzeit sind 2 Einträge mit der Inventarnummer 'r102' und 'r201' enthalten.

Ich möchte jetzt eine Suche starten:

Code:
Con.Command = Con.SQLConnection.CreateCommand();
Con.Command.CommandText = "SELECT * FROM rechner WHERE Inventarnummer LIKE @Keyword;";
Con.Command.Parameters.AddWithValue("@Keyword", "%" + Keyword + "%");
Con.Command.ExecuteNonQuery();

Con.Reader = Con.Command.ExecuteReader();

while (Con.Reader.Read())
{
        listView_Computers.Items.Add(Con.Reader.GetValue(0).ToString());
        listView_Computers.Items[listView_Computers.Items.Count - 1].SubItems.Add(Con.Reader.GetValue(3).ToString());
}
Con.Reader.Close();

Con ist meine Connection-Klasse
Con.SQLConnection vom Typ MySQLConnection
Con.Command vom Typ MySQLCommand
Con.Reader vom Typ MySQLDataReader


Wenn ich jetzt als Keyword 'r' verwende, listet er mir korrekt beide Einträge auf.
Bei 'r1' als Suchwort kommt nix zurück, das gleiche bei 'r101' oder 'r201'.
Mir scheint, als würde der immer nur ein Char akzeptierren als Suchwort.

Vielen Dank für Hilfe!

Gruß Thax
 
Du kannst für die Suche mit LIKE Wildcards verwenden, z.B. 'r%' (alle Einträge die mit 'r' beginnen) oder 'r%2' (alle Einträge die mit 'r' beginnen und auf '2' enden). Du kannst auch '_' verwenden als Wildcard für nur einen Buchstaben.

Funktionierts damit?

Edit: Naja, man sollte sich den Beitrag schon genau durchlesen. :) Ich sehe gerade du hast bereits '%' verwendet.

Versuch mal folgendes:
Con.Command.Prepare() aufzurufen vor Parameters.AddWithValue() und ExecuteNonQuery() weglassen. ExecuteNonQuery wird normalerweise für INSERT, UPDATE oder DELETE verwendet (MSDN ExecuteNonQuery)
 
Zuletzt bearbeitet:
naja, ich will eher auf substrings hinaus, also Beispiel:

Eintrag in Datenbank: 5Hw-r2323-sds
Suche: r232

soll er mir den Treffer liefern.
 
probiers mal mit '@Keyword' weil es handelt sich ja um eine Zeichenkette und nicht um ein Zeichen. Und dann natürlich die Wildcards verwenden wie % oder _

zu deinem Post dann machst du einfach %r232% dann ist es egal an welcher stelle der Teilstring steht, aber die ' ' sind bei sauberem SQL wichtig.
 
Also wenn ich in MySql eingebe: select '5Hw-r2323-sds' LIKE '%r2%'
Dann gibt er mir 1 zurück.

Hast du mal versucht die Query direkt in MySQL auszuführen. Dann könnte man rausfinden, ob evtl dein C# Code fehlerhaft ist.
 
Wenn ich folgendes verwende:

Code:
Con.Command.CommandText = "SELECT * FROM rechner WHERE Inventarnummer LIKE '@Keyword';";

(man beachte die Hochkommas bei @Keyword)

dann sucht er nach einem string namens '@Keyword'.

--------------------------------------

Ich hab jetzt mal in der MySQL-Workbench folgendes als Query eingegeben:
Code:
SELECT * FROM rechner WHERE Inventarnummer LIKE '%r1%'

Klappt einwandfrei. Das gleiche in C# geht nicht (der sucht nach %r1%)
 
Zuletzt bearbeitet:
Dann macht er also Con.Command.Parameters.AddWithValue(.... gar nicht mehr bzw es ersetzt nichts?

Lass dir vor dem ausführen am besten immer mal den SL Befehl ausgeben und probier ihn so im MYSQL mal aus.

Edit:
ok das mit den ' ' beim @Keyword ist käse, weil da wird das nicht mehr als parameter erkannt vom SQL Interpreter
 
Zuletzt bearbeitet:
Versuch mal folgendes:
Con.Command.Prepare() aufzurufen vor Parameters.AddWithValue() und ExecuteNonQuery() weglassen. ExecuteNonQuery wird normalerweise für INSERT, UPDATE oder DELETE verwendet (MSDN ExecuteNonQuery)
 
Dann macht er also Con.Command.Parameters.AddWithValue(.... gar nicht mehr bzw es ersetzt nichts?

Wenn ich es so geschrieben habe:

Code:
"SELECT * FROM rechner WHERE Inventarnummer LIKE '%@Keyword%'; ";
Con.Command.Parameters.AddWithValue("@Keyword", Keyword);

dann ersetzt er @Keyword nicht mit dem Suchbegriff, sondern sucht nach @Keyword.

Wenn ich es ohne die Hochkommas mache, also:

Code:
"SELECT * FROM rechner WHERE Inventarnummer LIKE %@Keyword%; ";
Con.Command.Parameters.AddWithValue("@Keyword", Keyword);

und r als Suchwort verwende, dann kommt folgender MySQL-Fehler:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%'r'%' at line 1
Ergänzung ()

Code:
Con.Command = Con.SQLConnection.CreateCommand();
            Con.Command.CommandText = "SELECT * FROM rechner WHERE Inventarnummer LIKE @Keyword;";
            Con.Command.Prepare();
            Con.Command.Parameters.AddWithValue("@Keyword", "%" + Keyword + "%");

            Con.Reader = Con.Command.ExecuteReader();

So meinst du? Da liefert der mir nur beim Suchwort 'r' die richtigen Treffer, bei 'r1' gar keinen.
 
Ich glaube, das müsste lauten:
Code:
SELECT * FROM rechner WHERE Inventarnummer LIKE '%'+@Keyword+'%';
 
du meinst so?

Code:
Con.Command.CommandText = "SELECT * FROM rechner WHERE @SearchProp LIKE" + '%'+ @Keyword +'%' + ";";

da stürzt er mit vorhin genannter Fehlereldung ab.

---

Ich bin mir sicher, dass die Prozentzeichen in den Parametern liegen müssen. Hilft mir bloß grad nix, weil es klappt ja nicht mal, wenn diese direkt im CommandText eingetragen sind...
 
Funktioniert folgendes auch nicht?

Code:
MySqlCommand com = Con.SQLConnection.CreateCommand();
com.CommandText = @"SELECT * FROM rechner WHERE Inventarnummer LIKE '%'+@keyword+'%';";
com.Prepare();
com.Parameters.AddWithValue("@keyword", Keyword);

Con.Reader = com.ExecuteReader();
 
Zuletzt bearbeitet:
Sicher so? Weil das + wird jetzt mit als Suchwort genommen:

Code:
Con.Command.CommandText = @"SELECT * FROM rechner WHERE Inventarnummer LIKE '%'+@keyword+'%';";

Meinst du so?

Code:
Con.Command.CommandText = @"SELECT * FROM rechner WHERE Inventarnummer LIKE '%'"+@keyword+"'%';";


So wie du es gepostet hat, kommt folgender Fehler:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '+'r'+'%'' at line 1
 
Sehr merkwürdig...

Dann mein letzter Vorschlag:

Con.Command.CommandText = @"SELECT * FROM rechner WHERE Inventarnummer LIKE CONCAT('%', @keyword, '%');";

Edit:
Noch eine kleine Ergänzung: Schau dir eventuell mal den MySQL-Fulltext-Search an (Doc),
denn %...% ist nicht wirklich performant, da keine Indizes verwendet werden können.
 
Zuletzt bearbeitet:
Hm es sieht so aus als könne man in MySQL Strings nicht mit + aneinanderhängen.
Dann musste es lauten:
Code:
SELECT * FROM rechner WHERE Inventarnummer LIKE concat('%', @keyword, '%');
 
Sehr merkwürdig...

Dann mein letzter Vorschlag:

Con.Command.CommandText = @"SELECT * FROM rechner WHERE Inventarnummer LIKE CONCAT('%', @keyword, '%');";

Das klappt! Juhu! :)

Du musst mir nur noch erklären, ob ich jetzt Command.ExecuteNonQuery verwenden muss und was das Command.Prepare bedeutet. :)
 
Sehr gut! :) ExecuteNonQuery brauchst du nicht zu verwenden, da du damit den Query praktisch zweimal ausführst, allerdings wird bei ExecuteNonQuery kein Resultset zurückgegeben, sondern nur die Anzahl der geänderten/gelöschten/eingefügten Tuples. ExecuteNonQuery verwendest du also normalerweise bei INSERT/UPDATE/DELETE - Statements. Genaueres zu Prepare findest du eventuell noch hier
 
Hey, vielen Dank an alle!

Ich habs jetzt sogar mit dynamischen Spaltennamen hinbekommen:

Code:
Con.Command.CommandText = @"SELECT * FROM rechner WHERE " + SearchByProp.ToString() + " LIKE CONCAT('%', @keyword, '%');";

SearchbyProp ist vom Typ Enumeration

Jetzt kann ich nicht nur in der Spalte Inventarnummer suchen, sondern auch in einer beliebig anderen. Wunderhübsch. :)

Gruß Thax
 
Wieso alles so kompliziert?
Code:
String.Format("SELECT * FROM rechner WHERE Inventarnummer LIKE '{0}';",<KeywordVariable>);
String.Format baut intern mit einem StringBuilder(=schnell) einen String zusammen, du kannst das auch noch mit {1},{2} etc. ergänzen und einen SQL Query exakt so aufbauen wie es sein soll.
 
Zurück
Oben