SQL错误或缺少数据库(接近"?":语法错误)

时间:2014-11-20 13:47:34

标签: java sqlite

你会那样,告诉我这里有什么不对吗? connDriverManager.getConnection(DB_URL)

        try {
            PreparedStatement prepStmt = conn.prepareStatement(
                    "UPDATE week SET ?=? WHERE id>=? AND id<=?");
            prepStmt.setString(1, s);
            prepStmt.setFloat(2, x);
            prepStmt.setInt(3, c);
            prepStmt.setInt(4, d);
            prepStmt.executeUpdate();
        } catch(SQLException e) {
            System.err.println("Error during data update");
            e.printStackTrace();
        }

错误在第一行&#34;尝试&#34;它就像&#34; SQL错误或缺少数据库(接近&#34;?&#34;:语法错误)&#34;。我必须补充一点,当我在cmd中使用&#34;?&#34;用价值取代它作为魅力。

4 个答案:

答案 0 :(得分:2)

您不能将列名作为参数传递给预准备语句。您只能将值作为参数传递:

    try {
        PreparedStatement prepStmt = conn.prepareStatement(
                "UPDATE week SET some_column_name=? WHERE id>=? AND id<=?");
        prepStmt.setFloat(1, x);
        prepStmt.setInt(2, c);
        prepStmt.setInt(3, d);
        prepStmt.executeUpdate();
    } catch(SQLException e) {
        System.err.println("Error during data update");
        e.printStackTrace();
    }

答案 1 :(得分:1)

您无法将列名传递给PreparedStatement。你能做些什么来克服这个问题就是在字符串中改变它。

try {
    PreparedStatement prepStmt = conn.prepareStatement(
    "UPDATE week SET " + s + " =? WHERE id>=? AND id<=?");
    prepStmt.setFloat(1, x);
    prepStmt.setInt(2, c);
    prepStmt.setInt(3, d);
    prepStmt.executeUpdate();
} catch(SQLException e) {
    System.err.println("Error during data update");
    e.printStackTrace();
}

答案 2 :(得分:0)

你不应该这样做吗? =?你应该指定字段id =?...或者你想要的任何字段。

PreparedStatement prepStmt = conn.prepareStatement(
                    "UPDATE week SET columnName=? WHERE id>=? AND id<=?");

答案 3 :(得分:0)

如前所述,您不能将列名 sql语法传递给PreparedStatement。但是,您可以使用String.format()将任何内容传递给sql:

try {
                String sql = "UPDATE week SET %s=? WHERE id>=? AND id<=?";
                sql = String.format(sql , "s")
                PreparedStatement prepStmt = conn.prepareStatement(sql);
                prepStmt.setFloat(1, x);
                prepStmt.setInt(2, c);
                prepStmt.setInt(3, d);
                prepStmt.executeUpdate();
            } catch(SQLException e) {
                System.err.println("Error during data update");
                e.printStackTrace();
            }

您会看到? = ?%s = ?取代,后来列名被String.format取代,随后字符串被传递给PreparedStatement。 但是,不应将其用于传递数据,因为它违反了PreparedStatement的目的。

相关问题