使用JDBC运行查询时的SQLException

时间:2016-01-11 01:16:44

标签: java sql-server jdbc sqlexception

在我的程序中,我使用JDBC执行一些SQL查询。当我为这个特定查询运行程序时,我收到以下错误:

SQLException:线程“main”java.sql.SQLException中的异常:在TransformData.main(TransformData.java:213)

以下是代码的这一部分:

    try
    {
        dbcon = DriverManager.getConnection(url,"username","password");
        stmt = dbcon.createStatement();
        stmt1 = dbcon.createStatement();
        stmt13 = dbcon.createStatement();
        stmt14 = dbcon.createStatement();
        String sql1 = "SELECT DISTINCT payer_id FROM transactions ORDER BY payer_id";
        rs1 = stmt1.executeQuery(sql1);

        while (rs1.next())
        {
            Integer payer_id = rs1.getInt("payer_id");
            payer_ids.add(payer_id);
        }
        rs1.close();
        stmt1.close();
        for(int i = 0; i < payer_ids.size(); i++)
        {
            String sql13 = "SELECT COUNT(*)  AS counter, isCOrporate FROM transformed_table WHERE payer_id = "+payer_ids.get(i)+" ";
            rs5 = stmt13.executeQuery(sql13);
            while(rs5.next())
            {
                int counter = rs5.getInt("counter");
                int isCorporate = rs5.getInt("isCorporate");
                if ((counter - payer_ids.get(i).intValue() - isCorporate) < 1)
                {
                    String sql14 = "DELETE FROM transformed_table WHERE payer_id = "+payer_ids.get(i)+" ";
                    stmt14.executeUpdate(sql14);
                }
            }
        }
        rs5.close();
        stmt13.close();
        stmt14.close();

        dbcon.close();
     }
     catch(SQLException e)
     {
         System.out.print("SQLException: ");
                        throw new SQLException(errorMessages);

     }

第213行是这一行:throw new SQLException(errorMessages);在catch中。 我试图找到可能抛出此异常的内容。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

这段代码有很多问题,但这里有相关的提示:你的catch块是错误的。这样写:

catch(SQLException e) {
    e.printStackTrace();
}

您的方式从堆栈跟踪中排出所有有用的信息。你无法调试你做错的其他事情。

进行更改,重新运行代码并读取堆栈跟踪。它会告诉你你的真正问题是什么。

要纠正的事情很多:

  1. 资源未正确关闭。这些应该在finally块中的单个try / catch块中完成。
  2. 编写错误的SQL。使用JOIN可以更有效地完成DELETE。
  3. 分解不良。这里隐藏着2或3种方法。
  4. 没有交易经理;没有ACID。
  5. 没有连接池;应该传递给这个方法,而不是在范围内实例化。
  6. 应使用PreparedStatement和绑定而不是连接String
  7. 我不确定,但看起来你有三个SQL查询:

    1. 选择所有付款人ID
    2. 获取COUNT个付款人ID
    3. 删除SELECT中列出的所有付款人ID。
    4. 我能正确阅读吗?如果是的话,为什么不在一个查询中这样做呢?

      DELETE 
      FROM transformed_table 
      WHERE payer_id IN (SELECT DISTINCT payer_id FROM transactions)