verwendetes Datenbanksystem: Sql Server Express
Hallo habe, so hoffe ich ein kleines Problem mit einem SQL-String das ich
einem Sqlcommand übergebe.
In den Kundenname befinden sich unzählige Hochkomma, wie z.B. Franz's Würstelbude
Leider bekomme ich nun Probleme bei meinem SqlStatement mit den Hochkomma's
Wie könnte ich hier am besten vorgegen?? Danke für Eure hilfe.
Ich lese die Werte von einer Datatable mittels foreeach aus - also keine Benutzereingaben.
Mein String sieht so aus:
string strSQLUpdate = "UPDATE Kundenstamm SET KDNAME = '" + strKDNAME + "' WHERE KDKDNR = '" + strKDKDNR + "'";
Viele Grüsse
chrisbradyat
Hallo,
ich habe es zwar nicht ausprobiert, aber ggf. hilft hier die Klasse SqlCommand und die Eigenschaft Parameters weiter...
Grüße
David
Programming is like sex: One mistake and
you have to support it your lifetime
Das hilft in der Tat. Aber nicht nur zu dem Problem sondern vor allem hiergegen: http://de.wikipedia.org/wiki/SQL-Injektion
Hallo,
das mit den Parametern mit mir bekannt. SQL-Injektion kann hier nicht stattfinden.
Ich hole mir die Daten aus einer DB2-Datenbank von einer AS/400. Nun muss ich
die Daten in den Sql-Server bringen. Aufgrunde von bestimmten Constraints ist mir
ein Update bzw. Insert mit dem DataAdapter mittels da.update nicht möglich.
Ich muss also "manuell" die Daten reinbringen, ich lade also die Daten in eine
Datatable, gehe mit foreach jede Row durch, sobald ein Datensatz bereits am
SQL-Server existiert mache ich ein Update wenn nicht ein Insert.
So und jetzt habe ich die Probleme mit den Hochkommas. Was tun?
Vielen Dank für eure Antworten bereits im voraus.
chrisbradyat
Hi,
Wenn es garnicht anders geht (musste ich auch schon 2mal machen):
Einfache Hochkommas im Wert (!! NUR DORT !!) durch doppelte einfache Hochkommas ersetzen.
Juy Juka's => Juy Juka''s
sql += "'" + (string.Empty + value).Replace("'","''") + "',";
Gruß
Juy Juka
Vielen Dank Juy Juka,
jetzt funktionierts.
Hi,
also, ich will ja nicht meckern, aber Hochkommas zu Quoten (also in dem Fall doppelte draus zu machen), sry, ein schlechter Tip.
Ganz oben steht doch schon, dass das ganze Problem mit Parametern nicht auftaucht.
Neben der SQL-Injection und den Hochkommas gibts noch einen Grund: Geschwindigkeit. Mit deinem zusammengebastelten SQL wird jedes mal ein Ausführungsplan erstellt. Bei Parameterisireten Abfragen nur beim ersten Aufruf, da der SQL-Server diese im Chache behalten kann, es ändert sich a hier nicht der SQL Befehl an sich, sondern nur die Parameter bekommen unterschiedliche Werte.
soviel mal dazu
🙂
Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
Genau, und eben diese stringfrickelei fällt weg.
Sicherlich gibt es immer bessere Wege, habe kurz einen Test mit Parametern und
addwithvalue, funktioniert auch, dauert aber sicher zumindestens bei mir ca. 5x so lange. natürlich kann ich jetzt auch Parameter nutzen ohne addwithvalue.
Es geht bei meinem kleinen Programm auch nicht um eine Enduser App. sondern
dient nur für mich als Admin Daten von AS/400 2 SqlServer zu bringen.
Hier gibts sicherlich auch eine Menge von Möglichkeiten, aber ich wollte mich ein bischen
mit Datatables usw. beschäftigen.
Fazit: Bin natürlich für jeden Tip dankbar auch wenn es bessere Wege oder schlechtere Wege gibt.
Das Parameter länger dauern kann nicht sein, da wirstr du entwerder etwas falsch
gemacht haben, oder Äpfel mit birnen verwechseln.
Im Gegenteil, z.B. beim MS Sql-Server werden ausführungspläne am SqlString
erkannt, und da sich dieser nicht ändert, kann er wiederverwendet werden.
Und ich kann mir nicht vorstellen das die as400 das schlechter macht.
Und datatables sind der langsamste weg um daten zu transferieren, die sind
zur arbeit mit den Daten in der UI oder der Businessschicht gedacht.
etwas OffTopic:
hmm - wären doch bestimmt auch SIS-Packegaes geganegn, oder? Weil irgendwie kommt chrisbradyat ja an die AS/400 Daten.
OffTopic:
Warum will eigentlich nie jemand mit Parametern Arbeiten? Da kommen dann so schöne "Dann ersetzten wir das Hochkomma"-Konstrukte, nur weil ja überhaupt nicht vorrauszusehen war, dass die App Multilingual ist und sich auch griechische und türkische Benutzer anmelden...
GAAANZ OffTopic:
neulich in einer Loginbox eingegeben:
'; backup database master to disk N'c:\inetpub\wwwroot\master.bak'; --
da ist es dann ganz leicht mal kurz alles zu saugen.
🙂
Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
Zusammenfassend:
-Es gibt also die Möglichkeiten des Auskommentierens von Sonderzeichen in einer Query.
(Ist suboptimal?)
Ausser acht gelassen wurden bisher die Möglichkeiten der DB selbst also SP(SP= Stored Procedures).
ME macht der 2. Punkt wenig Sinn, da zu Providerspezifisch. Da kann man auch direkt ans Eingemachte gehen...(die Unterschiede in der Handhabung sind marginal).
Sofern die DB solches unterstützt(keine Frage bei SQL-Server und Konsorten).
Hallo,
ich habe ein ähnliches Problem wie im Startbeitrag. Allerdings handelt es sich nicht um einen SQL-String, sondern um den RowFilter eines Dataviews.
Also:
myDataview.RowFilter = "Kundenname = '" + kundenname + "'";
Und die Variable kundenname enthält ein Hochkomma. Der Vorschlag, das einfache Hochkomma durch ein doppeltes zu ersetzen, funktioniert hier nicht.
Habe versucht kundenname.Replace("'", @"'"), aber daraus macht der Compiler automatisch "\'". Also wenn der Kundenname z.B. heißt "Franz's Würstelbude" ergibt
kundenname.Replace("'", @"\'");
den Wert "Franz\'s Würstelbude".
Weiß jemand eine Lösung? Danke im Voraus.
Hi,
versuche es mal ohne dem @
kundenname.Replace("'", "\'");
Ich kann dir zwar nicht garantieren dass es funzt, aber nen Versuch ist es wert =)
Gruss
Michael
Hallo,
schon probiert, hat aber auch nichts gebracht. Der neue String sieht dann genau so aus wie vorher.
Also
string str = "Franz's Würstelbude";
str = str.Replace("'", "\'");
=> str hat immer noch den Wert "Franz's Würstelbude".
Habe es auch schon versucht mit regulären Ausdrücken:
Regex regex = new Regex("'");
regex.Replace(str, @"\'");
Mit und ohne @. Bringt alles nichts.
Die Klasse Regex besitzt noch eine Methode Escape, die in Zeichenketten den Sonderzeichen automatisch einen Backslash voranstellt. Leider sind die Sonderzeichen vorgegeben, bei denen der Backslash vorangestellt wird, und das Hochkomma ist nicht dabei. Aber sowas bräuchte ich.
Habe jetzt bei Wikipedia entdeckt, dass es für das Hochkomma mehrere Unicodes gibt. Habe es jetzt auch noch versucht mit
str.Replace('\'', '\u2019')
Es kommt dann zwar keine Fehlermeldung wie vorher, aber er findet den Kunden nicht mehr, weil im Kundennamen das Hochkomma den Unicode \u0027 hat.
Hallo
Wenn man anstatt:
string str = "Franz's Würstelbude";
str = str.Replace("'", "\'");
folgendes macht:
string str = "Franz's Würstelbude";
str = str.Insert(str.IndexOf("'"), "'");
funktionierts. Zumindest bei DataTable.Select() Querys.
In dieser Form allerdings nur dann, wenn nur ein Hochkomma in dem String vorkommt.
Gruß...
Boosa