【问题标题】:Exception on inserting into Access 2010 in C Sharp在 C Sharp 中插入 Access 2010 时出现异常
【发布时间】:2010-12-26 17:17:12
【问题描述】:


插入 Access 2010 数据库时出现此异常。

例如,如下:

INSERT INTO CranbrookMain (
       ID,BlockNo,Plot,SubPlot,Code,Type,LastName,FirstName,
       ServiceHome,ServiceAddress,ServiceCity,
       Notes
) VALUES (
       '1','Y','37','DS','C2','O','SMITH','John',
       'Service Inc.','520B SLATER ROAD N.W.','CityName',
       'CityName                          ☺    '
)

导致异常:

例如:System.Data.OleDb.OleDbException (0x80040E14): 查询表达式 ''CityName ☺' 中的字符串语法错误。 在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult 小时) 在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams,对象和 executeResult) 在 System.Data.OleDb.OleDbCommand.ExecuteCommandText(对象和执行结果) 在 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior 行为,对象和 executeResult) 在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior 行为,字符串方法) 在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery() 在 C:\Users\user\documents\visual studio 2010\Projects\ReadingData\ReadingData\Program.cs:line 238 中的 ReadingData.Program.Main(String[] args)

执行SQL插入查询的代码是:

insertSQL = "INSERT INTO CranbrookMain (ID,BlockNo,Plot,SubPlot,Code,Type,LastName," +
            "FirstName,ServiceHome,ServiceAddress,ServiceCity,Notes) VALUES (" +
            "'"+id+ "','" + blockNo + "','" + plot + "','" + subPlot + "','" + code + 
            "','" + type + "','" + lastname + "','" + firstname + "','" + serviceHome +
            "','" + serviceAddress + "','" + serviceCity + "','" + notes +"')";

OleDbCommand cmd = new OleDbCommand(insertSQL, con); // creating query command
cmd.ExecuteNonQuery();

错误发生在cmd.ExecuteNonQuery()函数调用中。

如果我直接在 Access 2010 文件中执行,上面的 SQL INSERT 语句可以正常工作。

【问题讨论】:

  • 你的城市名称旁边那个悲伤的笑脸在做什么?
  • 来自包含二进制数据的文件。
  • 文件???你正在传递一个城市的文件??

标签: c# ms-access exception


【解决方案1】:

使用参数化查询,您不会遇到此问题,也不会受到 SQL 注入攻击。

【讨论】:

    【解决方案2】:

    正如 RedFilter 所说,您不应该按照自己的方式构建 SQL。
    问题是您的 Notes 字段包含的数据未以数据库驱动程序可以解析的方式正确表示。

    如果您的任何值包含撇号,您认为会发生什么? 举例来说,您正试图保存 Mr O'Reilly 的记录,住在 22 Queen's Road)?
    你要么在你的数据库中得到垃圾,要么你会得到异常,或者更糟糕的是,有人可以很容易地inject some SQL and hack your database

    相反,请执行以下操作:

    insertSQL = "INSERT INTO CranbrookMain (ID,BlockNo,Plot,SubPlot,Code,Type,"
              + "LastName,FirstName,ServiceHome,ServiceAddress,ServiceCity,Notes) "
              + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";
    
    OleDbCommand cmd = new OleDbCommand(insertSQL, con);
    cmd.Parameters.Add("ID", OleDbType.Integer).Value = id;
    cmd.Parameters.Add("BlockNo", OleDbType.Char, 2).Value = blockNo;
    cmd.Parameters.Add("Plot", OleDbType.Char, 3).Value = plot;
    cmd.Parameters.Add("SubPlot", OleDbType.Char, 3).Value = subPlot;
    cmd.Parameters.Add("Code", OleDbType.Char, 3).Value = code;
    cmd.Parameters.Add("Type", OleDbType.Char, 3).Value = type;
    cmd.Parameters.Add("LastName",OleDbType.Char, 50).Value = lastname;
    cmd.Parameters.Add("FirstName", OleDbType.Char, 64).Value = firstname;
    cmd.Parameters.Add("ServiceHome", OleDbType.Char, 50).Value = serviceHome;
    cmd.Parameters.Add("ServiceAddress", OleDbType.Char, 128).Value = serviceAddress;
    cmd.Parameters.Add("ServiceCity", OleDbType.Char, 50).Value = serviceCity;
    cmd.Parameters.Add("Notes", OleDbType.Char, 255).Value = notes;
    
    cmd.ExecuteNonQuery();
    

    【讨论】:

    • +1 @RedFilter 给出了答案,你提供了代码示例
    【解决方案3】:
      ''CityName                          ☺'
    

    看起来您的 notes 变量包含一个撇号 >'

      notes = "'CityName                          ☺"
    

    正如@RedFilter 和@Renaud Bompuis 所说的“使用参数化查询”而不是连接字符串

    【讨论】:

      猜你喜欢
      • 2014-09-15
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 2012-10-26
      相关资源
      最近更新 更多