Sql语法错误未知字段列表但查找错误的字段?

时间:2013-11-29 19:11:31

标签: java sql

所以我创建了以下函数来写入数据库:

public static void updateBuyer(String ID, String name, Location latlong) {
    float lat = latlong.latitude;
    float lon = latlong.longitude;
    try {
        // new com.mysql.jdbc.Driver();
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        // conn =
        // DriverManager.getConnection("jdbc:mysql://localhost:3306/testdatabase?user=testuser&password=testpassword");
        conn = DriverManager.getConnection(connectionUrl, connectionUser,
                connectionPassword);
        stmt = conn.createStatement();
        String sql = "UPDATE Buyer " + "SET latitude ="
                + Float.toString(lat) + " WHERE idBuyer in (" + ID + ")";
        String sql2 = "UPDATE Buyer " + "SET longitude ="
                + Float.toString(lon) + " WHERE idBuyer in (" + ID + ")";
        String sql3 = "UPDATE Buyer " + "SET Name =" + name
                + " WHERE idBuyer in (" + ID + ")";

        stmt.executeUpdate(sql);
        stmt.executeUpdate(sql2);
        stmt.executeUpdate(sql3);
        conn.close();
    } catch (Exception e) {
        System.err.println(e);
    }
}

假设我通过了以下参数: (12,craigs,location location) 现在,当我运行该函数时,我收到以下错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'craigs' in 'field list'

12是我之前从数据库中检索到的ID, craigs是我试图插入的随机名称,并且 location对象只是一组坐标(lat,long)

这导致我认为它出于某种原因在表中寻找一个名为“craigs”的字段,但为什么会这样做呢?

1 个答案:

答案 0 :(得分:1)

问题是你有这样的SQL:

UDPATE Buyer SET Name = craigs WHERE idBuer in (Whatever)

那是试图从名为“craigs”的列中复制值。

现在你可以添加撇号 - 但。而是使用参数化SQL和预准备语句。这样你就可以避免SQL injection attacks,你的代码会更简单,并且你会避免不必要的字符串转换,这可能会导致问题,尤其是日期值。

此外,您只需要一个语句,它可以更新所有三列:

String sql = "UPDATE Buyer SET Name=?, latitude=?, longitude=? WHERE idBuyer=?";
try (PreparedStatement statement = conn.prepareStatement(sql)) {
    statement.setString(1, name);
    statement.setFloat(2, lat);
    statement.setFloat(3, lon);
    statement.setString(4, ID);
    statement.executeUpdate();
}

(请注意,我假设您实际上只是尝试更新单个买家 - 目前还不清楚为什么要使用IN。还要注意我正在尝试使用资源声明,之后将自动关闭声明。)

此外,我强烈建议您尽量避免抓住Exception。如果必须,请抓住SQLException - 但实际上你可能会更好地让它只是在调用堆栈中传播。