Wie lösen Sie einen syntax Fehler bei der Verwendung dieser INSERT-INTO-Anweisung und die .NET-OleDb-namespace?
Ich erhalte eine Fehlermeldung, wenn ich Versuch, das einfügen von Werten in eine Access-Datenbank.
Den Fehler syntaktische, was führt zu der folgenden Ausnahme:
OleDbException wurde nicht behandelte Syntaxfehler in der INSERT INTO-Anweisung.
private OleDbConnection myCon;
public Form1()
{
InitializeComponent();
myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\File.mdb");
}
private void insertuser_Click(object sender, EventArgs e)
{
OleDbCommand cmd = new OleDbCommand();
myCon.Open();
cmd.Connection = myCon;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "INSERT INTO User ([UserID], [Forename], [Surname], " +
"[DateOfBirth], [TargetWeight], [TargetCalories], [Height]) " +
"VALUES ('" + userid.Text.ToString() + "' , '" +
fname.Text.ToString() + "' , '" +
sname.Text.ToString() + "' , '" +
dob.Text.ToString() + "' , '" +
tarweight.Text.ToString() + "' , '" +
tarcal.Text.ToString() + "' , '" +
height.Text.ToString() + "')";
cmd.ExecuteNonQuery();
myCon.Close();
}
Kannst du die Fehlermeldung, die Sie empfangen?
sind Sie eine Ausnahme? Ist die Anwendung abstürzt? Schließen Sie die Anweisungen in einen try..catch-block abfangen der Ausnahme und poste die exception-Meldung.
Hallo dies ist die Ausnahme, Meldung: Syntaxfehler in der INSERT INTO-Anweisung OleDbException wurde nicht behandelte
Ich arbeite nicht in C#, also nicht wissen, wie es mit Ihr interagiert Datenbank-interface-Schicht, aber Jet/ACE verwendet
sind Sie eine Ausnahme? Ist die Anwendung abstürzt? Schließen Sie die Anweisungen in einen try..catch-block abfangen der Ausnahme und poste die exception-Meldung.
Hallo dies ist die Ausnahme, Meldung: Syntaxfehler in der INSERT INTO-Anweisung OleDbException wurde nicht behandelte
Ich arbeite nicht in C#, also nicht wissen, wie es mit Ihr interagiert Datenbank-interface-Schicht, aber Jet/ACE verwendet
#
als Trennzeichen für den string-Darstellung von Datum-Werten, nicht '
. Dies zu ändern könnte helfen. Zumindest schreiben die SQL-Zeichenfolge gesendet und sehen, wenn Sie können führen Sie es in einen interaktiven Zugang.InformationsquelleAutor Howard | 2011-01-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, Sie haben nicht angegeben, was der Fehler ist - aber das erste problem ist, dass Sie das einfügen der Daten direkt in die SQL-Anweisung. Nicht. Sie sind Einladend SQL-injection-Angriffe.
Verwenden parametrisierte SQL-Anweisung statt. Sobald Sie das getan haben, wenn Sie immer noch Probleme haben, die Bearbeitung dieser Frage mit dem neuen code und sagen, was der Fehler ist. Der neue code ist wahrscheinlich schon klarer, denn es wird nicht eine riesige Verkettung eingebunden, leicht versteckt, so etwas wie eine nicht übereinstimmende Klammer.
EDIT: Wie erwähnt in den Kommentaren, Jet/ACE ist anfällig für weniger Arten von SQL-injection-Angriff, da es nicht erlauben, DML. Für diese INSERT-Anweisung kann es eigentlich sein keine Schwachstelle - aber für ein SELECT mit einer WHERE-Klausel auf eine ähnliche Weise geschrieben, Benutzereingaben umgehen konnte einige der Schutz der WHERE-Klausel. Ich würde raten Ihnen dringend zur Verwendung von parametrisierten Abfragen als eine Selbstverständlichkeit:
(Sie brauchen auch nicht alle Aufrufe
ToString
. Nicht nur würde ich erwarten, dass eine Eigenschaft namensText
ist bereits ein string, aber die Tatsache, dass Sie über die string-Verkettung bedeutet, dass die string-Konvertierungen automatisch geschehen, sowieso.)Oh, großer Experte, von DAHER, bitte geben Sie uns einen überblick über das Ausmaß der Gefahren, die von SQL-Injection mit Jet/ACE-Daten speichern. Möchten Sie vielleicht zu suchen, ALSO bevor er antwortet mit, dass...
Es scheint mir, dass etwas Klassen von SQL-injection-Angriff nicht anwendbar sind hier (denen DML), aber auch andere Klassen sein könnte (die mit den geraden
"WHERE X='"+input+'"
code. (Ich habe Ihren Beitrag gelesen bei pcreview.co.uk/forums/thread-4021211.php die Rede, und im Zusammenhang DAMIT Beiträge). Darüber hinaus parametrisierte SQL-hält Daten getrennt von code, die ich zu Allgemeinen sauberer. Endlich kann ich einfach sehen, dass jemand die Portierung dieser code von Jet/ACE zu anderen Datenbank-Plattform, ohne zu überdenken, jede mögliche Gefahr.Auch vergessen zu erwähnen, dass es heißt, Sie müssen nicht sorgen zu machen über die "Reinigung" oder die Flucht der Eingabe. Ich betrachte das parametrisierte Abfragen, wie die best Art und Weise zu bewältigen, sagen, Familiennamen O ' Reilly. Ich wage zu sagen, es gibt die Jet/ACE-spezifische Routinen zum ausführen der Flucht - aber was sind die Vorteile von denen, die über die Verwendung einer Technik, die weitgehend portabel Datenbanken? (Sie können ändern müssen, zwischen benannten und zusätzlichen Parametern, aber der grundsätzliche Ansatz der gleiche sein wird.)
Das nicht tatsächlich scheinen die an allen bezogen.
InformationsquelleAutor Jon Skeet
Ich dies geschrieben, als Kommentar zu der doppelte Frage auf: Syntaxfehler in der INSERT INTO-Anweisung in c# und OleDb Exception cant spot der Fehler
"Benutzer" ist auch ein reserviertes Wort in Access (Beurteilung durch die Anbieter in Ihrer Verbindungszeichenfolge).
Aber ich Stimme völlig mit Jon-wenn Sie fix Ihre aktuelle Umsetzung, Sie sind nur zur Eröffnung eine große Sicherheitslücke (gegen Ihre Benutzer-Tabelle, nicht weniger!)
InformationsquelleAutor Tim Medora
Dieses problem kann auftreten, wenn Ihre Datenbank-Tabelle enthält eine Spalte-Namen, die Microsoft Jet 4.0-reservierte Wörter.
Ändern Sie die Spaltennamen der Datenbank-Tabelle, so dass Sie nicht mit Jet 4.0 reservierte Wörter.
InformationsquelleAutor user3183270
Wenn
TargetWeight
,Height
, undTargetCalories
sind floating-point oder integer-Werte, die Sie nicht brauchen, um Anführungszeichen in der SQL-Anweisung.Auch, nicht direkt bezogen auf deine Frage, aber man sollte sich wirklich überlegen, die Verwendung einer parametrisierten Abfrage. Ihr code ist sehr anfällig für SQL-injection.
InformationsquelleAutor Brennan Vincent
hier ist der Fehler in dr es sagt syntax-Fehler ehile in DBMS seine Arbeit Gut
InformationsquelleAutor user1289578
Nach dieser
überprüfen, was es enthält, vielleicht
[DateOfBirth]
hat illegal formatInformationsquelleAutor CLARK