有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

sql Java problemDatabase语法错误位于或接近“:”

我使用的是PostgreSQL数据库,当我试图插入数据时,它会给我一个错误问题database error:error syntax error at or near:“Position 206”

以下是插入查询的代码:

public static Model_Customer Insert(String FName, String LName, String Registration, String Make, String Model, String Engine, String Year, String Mileage, String Type, String Date, String Time)  throws Exception {
    try{        
        Statement stmt = Model_Customer.conn.createStatement();
        ResultSet rs = stmt.executeQuery("INSERT INTO appointment (fname, lname, registration, make, model, engine, year, mileage, type, date, time) VALUES ("+FName+",'"+LName+"','"+Registration+"','"+Make+"','"+Model+"','"+Engine+"','"+Year+"','"+Mileage+"','"+Type+"','"+Date+"',"+Time+") RETURNING appointmentid");
        if(rs.next())
            return Model_Customer.QueryID(rs.getInt(1));

    }catch(Exception e){
        throw new Database_Exception(e.getMessage());
        }    
    return null;      
    }

在Debug中,它可以进入executeQuery,然后直接进入catch异常并给出一个错误。数据库中的表和列都在那里。代码中没有“:”除了消息,所以我不知道为什么会这样

谢谢你的回答Joop Eggen我用了你的方式,不得不添加
stmt。executeUpdate(); 工作得很有魅力!谢谢


共 (1) 个答案

  1. # 1 楼答案

        PreparedStatement stmt = conn.prepareStatement(
            "INSERT INTO appointment (fname, lname, registration, make, model, "
            + "engine, year, mileage, type, \"date\", \"time\") "
            + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
        stmt.setInt(1, FName);
        stmt.setString(2, LName);
        stmt.setString(3, Registration);
        ...
        int updateCount = stmt.executeUpdate(Statement.RETURN_GENERATED_KEYS);
        ResultSet rs = stmt.getGeneratedKeys();
        if(rs.next())
            return Model_Customer.QueryID(rs.getInt(1));
    

    JDBC提供了一种独立于数据库引擎的方式来检索生成的键:一个插入行的结果集,每行包含生成的键

    RETURN_GENERATED_KEYS可能不需要。一些字段名可能是reserved key words,然后需要在其周围加上双引号


    关于推荐准备好的声明:

    每个...+var+...解释语句的第一句话是:使用一个带有... ? ...的准备好的语句。有两个非常重要的原因(除了一个有准备的州的效率和使用BLOB):

    • SQL injection,见this
    • 你可以省去撇号('),撇号转义、反斜杠等等都可以完成,你可以传递类型安全参数(int、java.sql.Date)