stmt.executeUpdate上的java servlet出错

stmt.executeUpdate上的java servlet出错,java,jdbc,compiler-errors,Java,Jdbc,Compiler Errors,这是我的代码: String[] teams = {"Blue Team", "Red Team", "Yellow Team", "Green Team", "Orange Team"}; int count = 0, team = 0; String selectSQL = "select * from students";

这是我的代码:

String[] teams = {"Blue Team", "Red Team", "Yellow Team", "Green Team", "Orange Team"};
            int count = 0, team = 0;
            String selectSQL = "select * from students"; // rand and distinct
            Statement stmt = conn.createStatement();
            ResultSet rs1 = stmt.executeQuery(selectSQL);
            // Retrieve the results
            while(rs1.next()){
                if(count==3){
                    team++;
                    count = 0;
                }
            stmt.executeUpdate("Insert into "teams[team]" values ('"+rs1.getString("studentno")+"', '"+rs1.getString("firstname")+"', '"+rs1.getString("surname")+"', '"+rs1.getString("degreecode")+"', '"+rs1.getString("dob")+"')");
            }
我在stmt.executeUpdate上得到一个错误。这就是错误:

java.lang.Error: Unresolved compilation problems: 
    Syntax error, insert ")" to complete MethodInvocation
    Syntax error, insert ";" to complete Statement
    Syntax error on token "]", AssignmentOperator expected after this token
    Syntax error on token ")", delete this token

    CreateTheTeams.doGet(CreateTheTeams.java:69)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
如何修复错误?

    stmt.executeUpdate("Insert into "teams[team]" values ('"+rs1.getString("studentno")+"', '"+rs1.getString("firstname")+"', '"+rs1.getString("surname")+"', '"+rs1.getString("degreecode")+"', '"+rs1.getString("dob")+"')");
有一个编译错误。您需要添加+来连接语句中的字符串:

        stmt.executeUpdate("Insert into "+teams[team]+" values ('"+rs1.getString("studentno")+"', '"+rs1.getString("firstname")+"', '"+rs1.getString("surname")+"', '"+rs1.getString("degreecode")+"', '"+rs1.getString("dob")+"')");

您的Java源文件中有语法错误,这与Servlet直接无关

请注意,在代码的这一部分:

stmt.executeUpdate("Insert into "teams[team]" values ('"+ // more code here
没有任何
+
“插入到”
团队[团队]
值(“
)相关。若要开始解决问题,请将该部分更改为:

stmt.executeUpdate("Insert into "+teams[team]+" values ('"+ // more code here
//                               ^           ^
从错误消息中,您可以自己判断:

java.lang.Error:未解决的编译问题:
声明您的文件甚至无法编译

但最好的部分是:

CreateTheTeams.doGet(CreateTheTeams.java:69)
告诉您查找错误的位置:在CreateTeams.java文件的69行。下次看到类似的内容时,请转到该行并仔细阅读,这可能会节省您一些时间。

您有两个错误:

  • 编译错误,因为您的
    字符串无效
  • 对两个不同的操作使用相同的
    语句
    。执行第二个操作时,已执行操作的
    结果集
    将丢失
  • 要解决每个问题:

  • 这不是有效的字符串:

    "Insert into "teams[team]" values ('"+rs1.getString("studentno")+"', '"+rs1.getString("firstname")+"', '"+rs1.getString("surname")+"', '"+rs1.getString("degreecode")+"', '"+rs1.getString("dob")+"')"
    
    您需要相应地连接
    字符串
    s:

    //note the usage of + signs between teams[team]
    "Insert into " + teams[team] + " values ('" + rs1.getString("studentno") +
        "', '"+ rs1.getString("firstname") + "', '" + rs1.getString("surname")+
        "', '" + rs1.getString("degreecode") + "', '" + rs1.getString("dob")+ "')"
    
  • 为此,最好使用新的
    语句

    String insertSql = "Insert into " + teams[team] + " values ('" + rs1.getString("studentno") +
        "', '"+ rs1.getString("firstname") + "', '" + rs1.getString("surname")+
        "', '" + rs1.getString("degreecode") + "', '" + rs1.getString("dob")+ "')";
    Statement stmtInsert = connection.createStatement(insertSql);
    stmtInsert.executeUpdate();
    
    但如果您使用
    PreparedStatement
    来避免SQL注入,这将更好。为此,请将代码更改为:

    String insertSql = "Insert into " + teams[team] + " values (?, ?, ?, ?, ?)";
    PreparedStatement pstmtInsert = connection.prepareStatement(insertSql);
    pstmt.setParameter(1, rs1.getString("studentno"));
    pstmt.setParameter(2, rs1.getString("firstname"));
    pstmt.setParameter(3, rs1.getString("surname"));
    pstmt.setParameter(4, rs1.getString("degreecode"));
    pstmt.setParameter(5, rs1.getString("dob"));
    pstmtInsert.executeUpdate();
    pstmtInsert.close();
    

  • 此外,这不是一个错误,但似乎从未更新
    count
    变量,因此
    if(count==3)
    永远不会发生。要修复它,请在执行DML insert操作后添加一个
    count++

    这只解决了编译问题,但仍然为两个不同的操作保留了
    语句的用法。事实上。实际上我根本没有研究代码的语义。我希望
    +
    只是修复了问题的开始(问题中所述)。由于重用了
    语句
    ,关闭的
    结果集
    ,应该立即产生
    异常
    ,并指出行(我希望在这方面有所帮助)。具体问题的直接解决方案是使用
    conn.createStatement().executeUpdate(“插入到”+团队[团队]+…
    ,但代码似乎有更多的问题(名为
    “蓝色团队”
    ?),这就是为什么我没有在反馈之前解决所有可能的问题。通过阅读OP在代码中的评论,似乎在最后阶段,他/她需要让每个团队都有不同的学生。非常感谢您的帮助!是的,“蓝色团队”是一项大学作业:)!名字没问题。我指的是桌子名称中的空格。并不是说它不存在,而是通常需要转义,比如
    插入到'blueteam'值中…
    。无论如何,在那里使用空格是不好的、容易出错的做法。