2016-06-09 15 views
1

Ich versuche, eine MS Access-Tabelle zu aktualisieren und es hält einen Fehler werfen:aktualisieren ExceptionNonQuery

An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll

Additional information: Syntax error in string in query expression 'EmID = '234'.

Die EmID in der Datenbank ist. Bitte helfen Sie

public partial class Sales : Form 
{ 
    ... 
    private void btnUpdate_Click(object sender, EventArgs e) 
    { 
     int EmpID = int.Parse(txtEmpID.Text); 

     OleDbConnection con = new  OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\SalesData.mdb"); 

     OleDbCommand update = new OleDbCommand("UPDATE Sales SET Printer = '" + txtPrinter.Text + "', Ink = '" +txtInk.Text + "', Paper = '"+txtPaper.Text+"' WHERE EmID = '" + txtEmpID.Text + " ", con); 

     con.Open(); 
     update.ExecuteNonQuery(); 
     con.Close(); 

     MessageBox.Show("Sales Updated"); 
    } 
    ... 
} 

Antwort

3

Sie haben vergessen, ein Schlussangebot nach dem WHERE-Wert hinzuzufügen. Das Problem zu beheben, indem das fehlende Zitat hinzugefügt wird, dient nur dazu, andere Probleme zu verbergen.

Was passiert, wenn einer Ihrer Textfelder ein einfaches Zitat enthält? Sie erhalten erneut eine Syntaxfehlerausnahme, die durch die Zeichenfolgenverkettung verursacht wird, wobei die Anführungszeichen als Trennzeichen für Ihre Werte dienen. Mit einem einfachen Zitat, das von Ihrem Benutzer eingegeben wurde, verwechseln Sie den SQL-Parser erneut.

um dieses Problem zu beheben (und einen ernsteren einen namens SQL-Injection) Sie Parameter verwenden beginnen müssen

string cmdText = @"UPDATE Sales SET Printer = @printer, 
        Ink = @Ink, Paper = @Paper 
        WHERE EmID = @id"; 

using(OleDbConnection con = new OleDbConnection(...)) 
using(OleDbCommand cmd = new OleDbCommand(cmdText, con)) 
{ 
    con.Open(); 
    cmd.Parameters.Add("@printer", OleDbType.VarWChar).Value = txtPrinter.Text; 
    cmd.Parameters.Add("@ink", OleDbType.VarWChar).Value = txtInk.Text; 
    cmd.Parameters.Add("@paper", OleDbType.VarWChar).Value = txtPaper.Text; 
    cmd.Parameters.Add("@id", OleDbType.VarWChar).Value = txtEmpID.Text; 
    cmd.ExecuteNonQuery(); 
} 
+0

Danke, ich bin immer noch einen Fehler bekommen: Eine nicht behandelte Ausnahme des Typs ‚System.Data .OleDb.OleDbException 'aufgetreten in System.Data.dll Zusätzliche Informationen: Syntaxfehler in UPDATE-Anweisung –

+1

@MattBrown: Es gibt ein extra, nicht benötigtes ** Komma ** ',' nach dem 'Papier = @ Papier,' kurz vor die 'WHERE'-Klausel - wenn Sie diese entfernen, sollten Sie gut gehen –

+0

Ich mag die Stack-Überlauf-Community, wie jeder neue Entwickler hilft, Basis-Datenbank-Angriffe wie S zu verhindern QL-Injektion. –