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?
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.
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.
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).
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.
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)
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...
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 ;-)
@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...