2016-03-28 3 views
1

dies funktioniert:Ich erhalte eine Fehlermeldung SQL-Syntax, wenn Sie diese Abfrage mit

string sqlStr = string.Format("INSERT INTO tblFiles (filename,downloadname,description,category,length,parts,checksum,isEncrypted,uploaderIp) VALUES ('{0}','{1}','{2}','{3}',{4},{5},'{6}',{7},'{8}');", 
      newFile.Name.Replace("'", "''"), newFile.DownloadName.Replace("'", "''"), newFile.Description, newFile.Category, newFile.Length, newFile.Parts, newFile.Checksum, newFile.IsEncrypted, GetPeerIp()); 

dies nicht:

string sqlStr = string.Format("INSERT INTO tblFiles (filename,downloadname,description,category,length,parts,checksum,isEncrypted,password,uploaderIp) VALUES ('{0}','{1}','{2}','{3}',{4},{5},'{6}',{7},'{8}','{9}');", 
     newFile.Name.Replace("'", "''"), newFile.DownloadName.Replace("'", "''"), newFile.Description, newFile.Category, newFile.Length, newFile.Parts, newFile.Checksum, newFile.IsEncrypted, password, GetPeerIp()); 

Ausnahme erhalte ich:

Ausnahme $ { "Syntax Fehler in INSERT INTO-Anweisung. "} System.Exception {System.Data.OleDb.OleDbException}

meine Datenbank sieht so aus.

enter image description here

Ich konnte nicht irgendein Problem mit ihm finden. Irgendwelche Ideen? Danke

+0

Als allgemeine Regel verwenden Sie immer Befehlsparameter, um bösartige SQL-Injection und andere unerwartete Fehler zu vermeiden. Sie können einige Codierungen für einfache (validierte) Ganzzahlen speichern, aber niemals für vom Benutzer bereitgestellte Daten. – fcm

Antwort

4

Passwort ist ein reserviertes Schlüsselwort in MS-Access sql. Wenn Sie ein Feld haben Sie mit diesem Namen müssen diesen Namen in eckigen Klammern verkapseln (es besser jetzt ändern)

string sqlStr = @"INSERT INTO tblFiles 
    (filename,downloadname,description,category,length,parts, 
    checksum,isEncrypted,[password],uploaderIp) VALUES (.....)"; 

sagte, bitte, nehmen Sie, dass alle String Verkettungen und eine parametrisierte Abfrage verwenden. Dies ist nicht nur sicherer (verhindert SQL-Injections), sondern auch beseitigt alle Probleme mit der Quotierung und korrekte Analyse von Daten und Dezimalzahlen

string sqlStr = @"INSERT INTO tblFiles 
    (filename,downloadname,description,category,length,parts, 
    checksum,isEncrypted,[password],uploaderIp) VALUES 
    (@file, @down, @desc, @cat, @len, @parts, @check, @enc, @pass, @up)"; 

OleDbCommand cmd = new OleDbCommand(sqlStr, connection); 
cmd.Parameters.Add("@file", OleDbType.VarWChar).Value = newFile.Name; 
cmd.Parameters.Add("@down", OleDbType.VarWChar).Value = newFile.DownloadName; 
... and so on for all other parameters respecting the OleDbType of the column.... 

cmd.ExecuteNonQuery(); 

Beachten Sie, wie Ihre Abfrage mehr klar und verständlich und wie Sie nicht brauchen eine Menge von Replace nur aufrufen, um mögliche eingebettete einfache Anführungszeichen loszuwerden.

Verwandte Themen