【问题标题】:java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statementjava.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] UPDATE 语句中的语法错误
【发布时间】:2014-08-13 15:02:32
【问题描述】:

谁能告诉我为什么我收到以下语法错误?谢谢。

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] UPDATE 语句中的语法错误。

stmt = conn.prepareStatement("UPDATE STAFFDIR " +
                       "SET Last_Name = ?, " +
                       "SET First_Name = ?, " +
                       "SET Phone = ?, " +
                       "SET Dept_Code = ?, " +
                       "SET Email = ?, " +
                       "SET Title = ?, " +
                       "SET Loc_Code = ? " + 
                       "WHERE ID = ?;");

               stmt.setString(1, ID);
               stmt.setString(2, Last_Name);
               stmt.setString(3, First_Name);                   
               stmt.setString(4, Phone);
               stmt.setString(5, Dept_Code);
               stmt.setString(6, Email);
               stmt.setString(7, Title);
               stmt.setString(8, Loc_Code);
               stmt.executeUpdate(); 

【问题讨论】:

  • 每一行都有 SET 关键字。只保留第一个。

标签: java sql sql-server


【解决方案1】:

Sql中的update语句不管设置多少字段都只需要一个SET,即

UPDATE STAFFDIR SET Last_Name = ?,
                    First_Name = ?, -- No extra set
                    Phone = ?, ...

顺便说一句,您是否使用了正确的驱动程序(MS Access 与 Sql Server)?

【讨论】:

  • 是的,我正在使用 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/test.accdb");
【解决方案2】:

应该只有一个 SET。如下操作

stmt = conn.prepareStatement("UPDATE STAFFDIR " +
                       "SET Last_Name = ?, " +
                       "First_Name = ?, " +
                       "Phone = ?, " +
                       "Dept_Code = ?, " +
                       "Email = ?, " +
                       "Title = ?, " +
                       "Loc_Code = ? " + 
                       "WHERE ID = ?;");

【讨论】:

    【解决方案3】:

    您的查询只需要一个 SET 并且您以错误的顺序绑定参数 -

    stmt = conn.prepareStatement("UPDATE STAFFDIR " +
      "SET Last_Name = ?, First_Name = ?, Phone = ?, " +
      "Dept_Code = ?, Email = ?, Title = ?, Loc_Code = ? " + 
      "WHERE ID = ?");
    int i = 1;
    // stmt.setString(1, ID);
    stmt.setString(i++, Last_Name);
    stmt.setString(i++, First_Name);                   
    stmt.setString(i++, Phone);
    stmt.setString(i++, Dept_Code);
    stmt.setString(i++, Email);
    stmt.setString(i++, Title);
    stmt.setString(i++, Loc_Code);
    stmt.setString(i++, ID); // <-- the 8th field.
    

    另外值得注意的是,Java 8 删除了 ODBC-JDBC 桥,因此您可能需要考虑寻找连接到 DataSource 的替代方法。

    【讨论】:

    • 回想起来,它实际上并没有进行更新,它什么也没做,但是语法错误消失了。为什么要让我把 ID 移到第 8 位?
    • @user3511659 因为您必须按照它们在查询中的相同顺序绑定参数。
    猜你喜欢
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多