SQLException while 运行 查询 JDBC
SQLException while running a query with JDBC
在我的程序中,我使用 JDBC 执行了一些 SQL 查询。当我 运行 这个特定查询的程序时,我得到以下错误:
SQL异常:线程 "main" java.sql.SQLException:at 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);
in catch。
我试图找到可能引发此异常的原因。有人可以帮忙吗?
这段代码有很多问题,但这里有一个中肯的提示:你的 catch 块是错误的。这样写:
catch(SQLException e) {
e.printStackTrace();
}
您的方式耗尽了堆栈跟踪中的所有有用信息。你不能调试你做错了什么。
进行更改,重新运行代码,并阅读堆栈跟踪。它会告诉您真正的问题是什么。
要更正的地方太多了:
- 资源未正确关闭。这些应该在 finally 块中的单个 try/catch 块中完成。
- 写得不好SQL。使用 JOIN 可以更有效地完成 DELETE。
- 分解不良。这里隐藏着 2 或 3 个方法。
- 没有事务管理器;没有酸。
- 没有连接池;应该传递给这个方法而不是在范围内实例化。
- 应该使用
PreparedStatement
和绑定而不是连接 String
。
我不确定,但您似乎有三个 SQL 查询:
- SELECT 所有付款人 ID
- 获取 COUNT 个付款人 ID
- 删除您从 SELECT 获得的列表中的所有付款人 ID。
我没看错吗?如果是,为什么不像这样在一次查询中完成呢?
DELETE
FROM transformed_table
WHERE payer_id IN (SELECT DISTINCT payer_id FROM transactions)
在我的程序中,我使用 JDBC 执行了一些 SQL 查询。当我 运行 这个特定查询的程序时,我得到以下错误:
SQL异常:线程 "main" java.sql.SQLException:at 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);
in catch。
我试图找到可能引发此异常的原因。有人可以帮忙吗?
这段代码有很多问题,但这里有一个中肯的提示:你的 catch 块是错误的。这样写:
catch(SQLException e) {
e.printStackTrace();
}
您的方式耗尽了堆栈跟踪中的所有有用信息。你不能调试你做错了什么。
进行更改,重新运行代码,并阅读堆栈跟踪。它会告诉您真正的问题是什么。
要更正的地方太多了:
- 资源未正确关闭。这些应该在 finally 块中的单个 try/catch 块中完成。
- 写得不好SQL。使用 JOIN 可以更有效地完成 DELETE。
- 分解不良。这里隐藏着 2 或 3 个方法。
- 没有事务管理器;没有酸。
- 没有连接池;应该传递给这个方法而不是在范围内实例化。
- 应该使用
PreparedStatement
和绑定而不是连接String
。
我不确定,但您似乎有三个 SQL 查询:
- SELECT 所有付款人 ID
- 获取 COUNT 个付款人 ID
- 删除您从 SELECT 获得的列表中的所有付款人 ID。
我没看错吗?如果是,为什么不像这样在一次查询中完成呢?
DELETE
FROM transformed_table
WHERE payer_id IN (SELECT DISTINCT payer_id FROM transactions)