Dickes Problem mit CRecordset daten in Datenbank schreiben!
-
HM ok ohne gute vorherige Prüfung geht das schief.
Aber mit den ? das habe ich trotzdem noch nie gesehen. Kannst nicht mal ein kurzes prägnantes Bsp posten, anstatt nur Brocken hinzuschmeißen?
-
Da ich C++ und Datenbanke hasse, hier ein Beispiel in C# (kannste aber auch in MC++ / C++/CLI machen; und wenn Du Dir mühe gibst geht das auch mit C++):
Gut:
using System; using System.Data.OleDb; namespace MyApp { class MyClass { static void Main(string[] args) { string derParameterVomBenutzer = "x'; DROP TABLE table; --'"; using(OleDbConnection con = new OleDbConnection()) { con.ConnectionString = "File Name = DieDatenbank.udl"; using(OleDbCommand cmd = new OleDbCommand("SELECT fieldlist FROM table WHERE field = ?", con)) { cmd.Parameters.Add(new OleDbParameter("0", derParameterVomBenutzer)); using(OleDbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // verarbeite die Zeilen... } } } } } } }
Schlecht:
using System; using System.Data.OleDb; namespace MyApp { class MyClass { static void Main(string[] args) { string derParameterVomBenutzer = "x'; DROP TABLE table; --'"; using(OleDbConnection con = new OleDbConnection()) { con.ConnectionString = "File Name = DieDatenbank.udl"; using(OleDbCommand cmd = new OleDbCommand(string.Format("SELECT fieldlist FROM table WHERE field = '{0}'", derParameterVomBenutzer), con)) { using(OleDbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // verarbeite die Zeilen... } } } } } } }
-
ich glaube da würd ich lieber mit Remove vom CString auf Teufel komm raus einfach alle ' aus dem Nutzerstring entfernen lassen und dann hat sich das Problem auch gelöst
ExecuteSQL akzeptiert ja auch nur 1 Parameter ...
-
Im managed-Code ist es wie gesagt nur eine Zeile mehr, deshalb gibt es keinen Grund es da nicht zu machen. Wie das ganze in native C++ aussieht sei mal dahingestellt. Rein Format muss man es natürlich auch machen... ich arbeite mit den ATL-DB-Consumer-Templates und da geht es eigentlich auch ohne Probleme...
-
Hm in C++ wüsst ich jetzt auch nicht auf anhieb, wie man das so macht.
Ich würde halt entweder die Zeichen entfernen, oder: wie kann man in nem SQl-String sagen, dass das ' entwertet werden soll? so wie in C++ mit dem \".
Geht das in SQL genauso? Hatte das Problem bisher noch nicht. Aber alternativ kann man auch alle ' suchen und halt dafür sorgen, dass die "entwertet" werden, wenn man denn weis wie das geht^^ und dann kann man es wieder einfach in den SQL-Comment einsetzen und sicher sein, dass da nichts reingekogelt wird.
-
Fakt: Die einzige sichere Lösung ist die Verwendung von Parametern.
-
Jochen Kalmbach schrieb:
Fakt: Die einzige sichere Lösung ist die Verwendung von Parametern.
Nöö, die Parametervariante muss das ja auch irgendwie auf einen String zurück führen nicht? Es wird einem da halt nur die Arbeit abgenommen.
-
Nein, tut sie nicht. Die Parameter werden separat übertragen und somit ist hier niergends ein String mehr im Spiel.
Fazit2: Die einzige sichere Lösung ist die Verwendung von Parametern.
-
So nun werde ich diesen Thread mal wieer aus kramen. Also
Statment = "INSERT INTO Artikel (Beschreibung) VALUES ('"+m_beschreibungh+"')";
DAs ging ja gnz gut nun habe ich das Problem das ich mehrere sachen eintragen will. Habe das dann mal in etwas so Probiert:
Statment = "INSERT INTO Artikel (Beschreibung,Preis) VALUES ('"+m_beschreibungh+","+m_preish+"')";
prob ist dabei wieder hinten die Formatierung. Weil wenn ich vorne Preis weg lasse packt er mir alles in ein Feld.
Vielleicht kann mir da ja noch mal einer helfe is sicher nicht viel arbeit für jemanden der so was öfters macht
THX
-
Du hast die Hochkommata vergessen.
Statment = "INSERT INTO Artikel (Beschreibung,Preis) VALUES ('"+m_beschreibungh+"','"+m_preish+"')";