| 

.NET C# Java Javascript Exception

2
Hallo,

zuerst den Code, dann das Problem:

Dim con As New MySqlConnection(db_verbindung)
Dim com As New MySqlCommand("call sp(@txt)", con)
com.Parameters.Add("@txt", MySqlDbType.Text).Value = TextBox2.Text
con.Open()
com.ExecuteNonQuery()

Dass sich die Zeile mit dem Parameter über AddWithValue kürzer schreiben lässt, ist mir klar.

Das Problem ist: wenn in der Textbox2 (irgendwo) ein ' (einfaches Anführungszeichen) steht, zerreißt es mir die Abfrage. Bei "normalen" Abfragen wie Insert Into funktioniert das ohne Probleme. Was muss ich ändern?

Vielen Dank!
02.10.2013
muffi 1,4k 1 9
2 Antworten
1
In den Quellen ms MySql-Connectors verwenden diese folgende Schreibweise welche offensichtlich funktionieren soll:

cmd.Parameters.Add( new MySqlParameter("?name", "my ' value"));

http://mysql-connector-net-5.0.sourcearchive.com/documentation/5.0.8.1/ParameterTests_8cs-source.html

Stellt sich jetzt die Frage, was meinst du mit "zerreißt es mir die Abfrage".

Versuch es erstmal mit einem einfachen Print @txt bzw. verwenden die in den Beispielen immer die "?txt"-Schreibweise.

MySqlCommand cmd = new MySqlCommand("SET @myvar = @txt", conn);
cmd.Parameters.Add( new MySqlParameter("@txt", "my ' value"));
cmd.ExecuteNonQuery();

cmd.CommandText = "SELECT @myvar";
MySqlDataReader reader = cmd.ExecuteReader();

Assert.AreEqual( true, reader.Read());
Assert.AreEqual( "my ' value", reader.GetValue(0));

bzw. (bitte beide Varianten mal probieren)

MySqlCommand cmd = new MySqlCommand("SET @myvar = ?txt", conn);
cmd.Parameters.Add( new MySqlParameter("?txt", "my ' value"));
cmd.ExecuteNonQuery();

cmd.CommandText = "SELECT @myvar";
MySqlDataReader reader = cmd.ExecuteReader();

Assert.AreEqual( true, reader.Read());
Assert.AreEqual( "my ' value", reader.GetValue(0));
02.10.2013
Floyd 14,6k 3 9
Floyd 14,6k 3 9
Mit "Zerreißen" meine ich, dass in dem Block der Catch-Teil (habe ich oben natürlich nicht mit abgebildet) zur Ausführung kommt - Fehler: Syntax Error vom MySQL-Server.
muffi 02.10.2013
Hab meinen Beitrag gerade nochmal bearbeitet
Floyd 02.10.2013
Wenn man alles lesen würde, würde sich ein zweiter Kommentar erübrigen ;-)
Normal nutze ich @txt statt ?txt (letzteres hatte ich aus Verzweiflung auch schon versucht). Wenn ich den Parameter im Direktfenster mit ?com.Parameters("@txt").Value ausgeben lasse, kommt ja auch die korrekte Anzeige "'". Und wie gesagt, wenn ich die StoredProcedure (call) durch ein Insert Into ersetze, marschiert das wunderbar. Ach ja: die Routine sp existiert natürlich auf dem Server.
muffi 02.10.2013
Beide Varianten sind gleich (ob die der Parameter mit @ oder ? los geht, ist egal; mir persönlich gefällt die Schreibweise mit @ besser). Wenn ich es mit einem "set @myvar=@txt" versuche, steigt er mir direkt aus mit "Fatal error encountered during command execution[...] Parameter '@myvar' must be defined." (hier steigt der Client aus). Eine Abänderung auf "set myvar=@txt;select myvar" bringt "Unknown system variable 'myvar'" (hier steigt der Server aus).
muffi 02.10.2013
declare @myvar varchar(100);set myvar=@txt;select myvar
Floyd 02.10.2013
Resultiert in:
"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 'declare myvar varchar(100);set myvar='\'';select myvar' at line 1"
Wenn ich das über phpMyAdmin mache, sieht man, dass er das declare offenbar nicht außerhalb einer SP mag.
muffi 02.10.2013
Ok, gerade nachgelesen. In MySql geht Declare nur innerhalb eines beginn..end blocks. Also nur in Proceduren.

"set @myvar=@txt;select @myvar" ... laut Dokumentation soll es so gehen. (Sorry, für den kleines Syntaxfehler, hatte das @ vergessen und somit war myvar eine globale Variable)
Floyd 02.10.2013
Die Variante hatte ich ja schon getestet (siehe Kommentar Nr. 4: "Beide Variante..."). Das mag der .Net-Connector nicht.
muffi 02.10.2013
0
Ich geh davon aus, dass Du dein einfaches Apostroph escapen musst. D.h. sowas in der Art wie
TextBox2.Text.Replace("'", "''"); 
// oder
TextBox2.Text.Replace("'", "\'");

Dass TextBox2.Text als direkter Input für eine SQL Abfrage dient, ist - nett ausgedrückt - grenzwertig. Wenn es sich nicht um ein Wegwerftool handelt, überdenke bitte Dein Design. Es mag funktionieren, aber...
02.10.2013
ffordermaier 8,4k 3 9
Manuell escapen, daran habe ich nicht gedacht. Ich hatte mich daran festgebissen, warum das der Connector nicht selbst macht (bei "normalen" Abfragen macht er das ja auch). Wird getestet.
Zum "Grenzwertigen": manchmal braucht man nicht einen riesen Overhead, so wie hier ;-)
muffi 07.10.2013
Manuelles Escapen ist eine schlechte Idee. Ein Beispiel:

EscapeManuell("\\\'") -> "\\\\'"
Floyd 07.10.2013
@Floyd: Als workaround für mich zur Not aber akzeptabel. Wenn ich beide Ansätze benutze, kommt dabei ein .Replace("\","/").Replace("'","\'") raus, das in dem Fall für mich vollkommen ausreichend ist.
Wäre trotzdem interessant, warum der Connector bei Calls zickt, sonst nicht...
muffi 07.10.2013

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH