java - Java,mysql错误:列数与第1行的值计数不匹配
问题描述
所以,这是我的一段代码,它将详细信息输入到名为 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() 行中显示错误。请帮助。谢谢!
解决方案
由于代码看起来不错,这可能是一个多用户问题。
首先,我会检查 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以获得相同的错误。
我的猜测是该应用程序没有以某种方式重新部署在 Web 服务器中。
at DBHandler.doPost(DBHandler.java:56)
这应该是int i = prep.executeUpdate();
指向 DBHandler.java 的第 56 行。添加几个空行来确定数字是否改变。
6 个问号(无引号 - 很好)、6 个列名、6 个参数集。
推荐阅读
- unix - 收到错误“make:*** No rule to make target `ins-all'。停止。” 尝试借助“doinstall”文件编译 GNAT 时
- java - 获取 DJI UX 拍摄的图像
- python-2.7 - Python 比较运算符
- vba - Enterprise Architect 的工件注释中未显示新行
- java - 如何通过 micronaut Http Client 将 grails 应用程序连接到 Consul?
- javafx - 如何在 Java FX 11 中实现 JavaFX 2.2 示例
- django - ModuleNotFoundError:没有名为“social_django_urls”的模块
- node.js - 在不同的文件夹中创建帖子
- sql-server - 在 SQL Server 中用新的 Int FK 替换 varchar FK
- php - Yii2 - 测验 - 使用多对多表