【问题标题】:Cannot detect error in the following jdbc code无法检测以下 jdbc 代码中的错误
【发布时间】:2011-04-22 20:28:37
【问题描述】:

替换为

package p1;



import java.sql.*;

public class jdbcDemo

{

    public static void main(String args[])
    { int id = 0;
    try
    { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
       Connection con = DriverManager.getConnection("jdbc:odbc:loginDSN");
       Connection con1 = DriverManager.getConnection("jdbc:odbc:loginDSN");
      Statement stat = con.createStatement();
      System.out.println("got connection");
      ResultSet rs = stat.executeQuery("Select max(UID) from mytable");
      while(rs.next())
      { id=rs.getInt(1);
      }
      id++;
      System.out.println(id);
      PreparedStatement ps = con1.prepareStatement("Insert into mytable(UID,Username,Password) values(?,?,?)");
      ps.setInt(1,id);
      ps.setString(2,"abhi");
      ps.setString(3,"bindra");


     ps.executeUpdate();

        }
    catch(Exception e)
    {

       e.printStackTrace();
    }



}
}

输出是

得到连接 6

但没有反映变化:(

【问题讨论】:

  • System.out.println("exception") 替换为e.printStackTrace(),然后告诉我们它的含义。
  • 您仍然需要告诉我们它的内容。向我们展示它打印到控制台的堆栈跟踪。
  • 没有堆栈跟踪。它运行完美。即使我将其设置为 int rows=ps.executeUpdate();它显示行的值为 1,但是当我查看表格时,没有记录的迹象。

标签: java database jdbc prepared-statement


【解决方案1】:

您正在尝试使用当前的 MAX(UID) 插入一个新的 UID。我想 UID 是主键,因此需要唯一性。在插入期间向 id 添加一个(也使用 WhiteFang34 的建议),使用序列或其他一些机制来自动更新列(例如 MySQL 中的自动编号)。

【讨论】:

  • 我确实增加了 id ,程序执行但更改在表中不可见 :(
  • @Arora 这是否意味着在增加 id 之后,在插入之前(这不会是线程安全的,但可能会在小型示例项目中工作),它执行 without 打印“异常”或者它根本不会崩溃?
  • 增加 id 后,打印执行,但更改未反映在表中
  • 如果它声称正在执行(并因此声称实际插入 1 条记录;rows == 1),那么我只能假设您对表有事务视图。重新加载表格。
【解决方案2】:

由于您将UID 视为int,因此您可能还需要将其设置为一个。由于您当前使用的是已经存在的max(UID),因此您可能还需要将其增加一。

ps.setInt(1, id + 1);

或者也许您根本不需要指定它,因为它是一个自动递增的列?

【讨论】:

  • 但我确实将其转换为字符串。?
  • 您应该指定更多细节,如 skaffman 建议的异常堆栈跟踪。否则我们只能猜测你的问题是什么。
  • 当然,好吧,我会这样做的:)
猜你喜欢
  • 2017-08-03
  • 1970-01-01
  • 2012-07-15
  • 2021-11-21
  • 2014-11-20
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多