【问题标题】:Java, mysql error:Column count doesn't match value count at row 1Java,mysql错误:列数与第1行的值计数不匹配
【发布时间】:2018-05-28 14:59:43
【问题描述】:

所以,这是我的一段代码,它将详细信息输入到名为 vendor_db 的数据库中。(使用 java 和 mysql),即使代码看起来正确,我每次都会收到错误。 我已经添加了整个 servlet 代码以供参考。

@WebServlet("/DBHandler")
public class DBHandler extends HttpServlet {
private static final long serialVersionUID = 1L; 
/**
 * @see HttpServlet#HttpServlet()
 */
public DBHandler() {
    super();
}
/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();
        FormBean f = (FormBean)request.getAttribute("formHandler");
        boolean userExists = false;
        final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
        final String DB_URL = "jdbc:mysql://localhost:3306/ioc?autoReconnect=true&useSSL=false";
        final String USER = "root";
        final String PASS = "1234";
        try( Connection conn=DriverManager.getConnection(DB_URL,USER,PASS)){
        Class.forName(JDBC_DRIVER);
        Statement st = conn.createStatement();
        ResultSet rs = st.executeQuery("select vcode from vendor_db");
        while(rs.next()) {
            if(f.getCode().equals(rs.getString(1)))
            {
                userExists=true;
            }
        }   
        if(userExists) {
            f.setErrors("code","Duplicate user: Try a different vendor code");
            getServletConfig().getServletContext().getRequestDispatcher("/forms/retry.jsp").forward(request, response);
        }
        else {
            String sql= "insert into vendor_db(vcode,vname,vmob,vemail,vpass,gst_no)values(?,?,?,?,?,?)";
            try(PreparedStatement prep = conn.prepareStatement(sql)){
            prep.setString(1,f.getCode());
            prep.setString(2,f.getName());
            prep.setString(3,f.getPhone());
            prep.setString(4,f.getEmail());
            prep.setString(5,f.getPass());
            prep.setString(6,f.getGst_no());
            int i = prep.executeUpdate();
            prep.clearParameters();
            if(i!=0) {
                getServletConfig().getServletContext().getRequestDispatcher("/forms/login.jsp").forward(request, response);
                }
                else {
                    pw.println("Not entered in database");
                }
                prep.close();
            }
            catch(Exception e) {
                System.out.println(e);
            }       
        }   
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

}

但是,我一直收到同样的错误:

java.sql.SQLException: Column count doesn't match value count at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
at DBHandler.doPost(DBHandler.java:56)

基本上是在 executeUpdate() 行中显示错误。请帮忙。谢谢!

【问题讨论】:

  • 确实,代码对我来说看起来不错。是不是表定义需要插入更多的列,比如没有 AUTOINCREMENT 的 ID 列,因此需要给出。或者这样。一个提示:try-with-resources 非常适合 JDBC。
  • 不,数据库只有六列。
  • try (PreparedStatement prep = conn.prepareStatement(sql)) { ... }close() 上的自动 } 即使有返回/中断/异常。 Connection 和 ResultSet 也一样。
  • 我试过了,还是不行。

标签: java mysql sql database


【解决方案1】:

由于代码看起来不错,这可能是多用户问题。

首先我会检查 DBHandler 的第 56 行确实是 executeUpdate。

DBHandler.doPost(DBHandler.java:56)

不知怎的,我对此表示怀疑。可能是部署出错或其他原因。

如果 DBHandler 或其他数据错误地是 servlet 的 字段,则 servlet 不是无状态的,两个 doPosts/doGet 可以“共享”同一个字段,覆盖它等等.

当显示的代码在源代码中拆分时,也可能发生这种情况,并且控制流允许覆盖字段,例如在 doGet 或服务中。

没有字段。


添加整个代码后

很遗憾只有小问题:

// Not needed nowadays: Class.forName(JDBC_DRIVER);
try (Connection conn = DriverManager.getConnection(DB_URL,USER,PASS);
        PreparedStatement st = conn.prepareStatement(
                "select vcode from vendor_db where vcode = ?")) {
    st.setString(f.getCode());
    try (ResultSet rs = st.executeQuery()) {
        if (rs.next()) {
            userExists = true;
        }
    }   
    if (userExists) {
        f.setErrors("code",
            "Duplicate user: Try a different vendor code");
        getServletConfig().getServletContext()
            .getRequestDispatcher("/forms/retry.jsp")
            .forward(request, response);
    }
    else {
        String sql= "insert into vendor_db"
            + "(vcode,vname,vmob,vemail,vpass,gst_no)"
            + "values(?,?,?,?,?,?)";
        try (PreparedStatement prep = conn.prepareStatement(sql)) {
            prep.setString(1, f.getCode());
            prep.setString(2, f.getName());
            prep.setString(3, f.getPhone());
            prep.setString(4, f.getEmail());
            prep.setString(5, f.getPass());
            prep.setString(6, f.getGst_no());
            int i = prep.executeUpdate();
            // Not needed here: prep.clearParameters();
            if (i != 0) {
                getServletConfig().getServletContext()
                    .getRequestDispatcher("/forms/login.jsp")
                    .forward(request, response);
            }
            else {
                pw.println("Not entered in database");
            }
        }
    }   
}
catch (Exception e)
{
    log("An error happened", e);
    e.printStackTrace();
}

请参阅java.sql.SQLException: Column count doesn't match value count at row 1 了解相同的错误。

我的猜测是该应用程序没有重新部署在网络服务器中。

at DBHandler.doPost(DBHandler.java:56)

这应该是int i = prep.executeUpdate();

指向 DBHandler.java 的第 56 行。添加几行空行来判断数字是否改变。

6 个问号(无引号 - 很好)、6 个列名、6 个参数集。

【讨论】:

  • 我添加了整个代码。你能检查一下吗?它仍然在 executeUpdate 行显示错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
相关资源
最近更新 更多