2016-03-28 50 views
1

这作品时,得到一个SQL语法错误:我使用此查询

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()); 

这并不:

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()); 

例外,我得到:

$ {例外“语法错误在INSERT INTO语句中。“} System.Exception {System.Data.OleDb.OleDbException}

我的数据库看起来像这样。

enter image description here

我无法找到它的任何问题。有任何想法吗? 谢谢

+0

作为一般规则,请始终使用命令参数来避免恶意SQL注入和其他意外错误。您可以为简单(有效)整数保存一些编码,但从不保存用户提供的数据。 – fcm

回答

4

密码是MS-Access sql中的保留关键字。如果你有你需要封装方括号之间的名称命名的字段(现在好了更改)

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

说,请删除所有的字符串连接,并使用参数化查询。这不仅是更安全(防止SQL注入攻击),而且还删除了所有问题,报价和日期的正确分析和小数

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(); 

注意查询是如何更清晰易懂,你怎么不需要调用大量的替换只是为了摆脱可能的嵌入式单引号。