Java 使用JDBC运行查询时发生SQLException
在我的程序中,我使用JDBC执行一些SQL查询。当我为此特定查询运行程序时,我得到以下错误: SQLException:线程“main”java.sql.SQLException中的异常:位于TransformData.main(TransformData.java:213) 以下是这部分代码:Java 使用JDBC运行查询时发生SQLException,java,sql-server,jdbc,sqlexception,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 =
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);
}
试试看
{
dbcon=DriverManager.getConnection(url,“用户名”、“密码”);
stmt=dbcon.createStatement();
stmt1=dbcon.createStatement();
stmt13=dbcon.createStatement();
stmt14=dbcon.createStatement();
String sql1=“按付款人id从交易订单中选择不同的付款人id”;
rs1=stmt1.executeQuery(sql1);
while(rs1.next())
{
整数payer_id=rs1.getInt(“payer_id”);
付款人标识。添加(付款人标识);
}
rs1.close();
stmt1.close();
对于(int i=0;i
第213行是这一行:抛出新的SQLException(errorMessages)代码>在捕获中。
我正在试图找到可能引发此异常的原因。有人能帮忙吗?这段代码有很多地方出错,但这里有一个相关的提示:您的catch块出错了。这样写:
catch(SQLException e) {
e.printStackTrace();
}
您的方式会从堆栈跟踪中耗尽所有有用的信息。你不能调试你还做错了什么
进行更改,重新运行代码,然后读取堆栈跟踪。它会告诉你你真正的问题是什么
要纠正的事情太多了:
资源未正确关闭。这些应该在finally块中的单个try/catch块中完成
编写糟糕的SQL。使用联接可以更有效地执行删除
分解不良。这里隐藏了2到3种方法李>
没有交易经理;没有酸
没有连接池;应该传递到此方法中,而不是在范围中实例化
应该使用PreparedStatement
和绑定,而不是串接String
李>
我不确定,但看起来您有三个SQL查询:
选择所有付款人ID
获取付款人ID的计数
删除从SELECT获得的列表中的所有付款人ID
我读对了吗?如果是,为什么不在一个查询中这样做呢
DELETE
FROM transformed_table
WHERE payer_id IN (SELECT DISTINCT payer_id FROM transactions)
这段代码有很多错误,但这里有一个相关的提示:您的catch块是错误的。这样写:
catch(SQLException e) {
e.printStackTrace();
}
您的方式会从堆栈跟踪中耗尽所有有用的信息。你不能调试你还做错了什么
进行更改,重新运行代码,然后读取堆栈跟踪。它会告诉你你真正的问题是什么
要纠正的事情太多了:
资源未正确关闭。这些应该在finally块中的单个try/catch块中完成
编写糟糕的SQL。使用联接可以更有效地执行删除
分解不良。这里隐藏了2到3种方法李>
没有交易经理;没有酸
没有连接池;应该传递到此方法中,而不是在范围中实例化
应该使用PreparedStatement
和绑定,而不是串接String
李>
我不确定,但看起来您有三个SQL查询:
选择所有付款人ID
获取付款人ID的计数
删除从SELECT获得的列表中的所有付款人ID
我读对了吗?如果是,为什么不在一个查询中这样做呢
DELETE
FROM transformed_table
WHERE payer_id IN (SELECT DISTINCT payer_id FROM transactions)
哪一个是第213行?@PritamBanerjee我在我的问题中说,抛出新的SQLException(errorMessages)代码>如果您使用catch块来抑制异常,那么抛出会破坏这一点。打印堆栈跟踪以找出是什么导致它被抛出。在调试器中进入/跳过方法可能会向您显示一些额外的信息(您可以查看变量值并创建观察程序)。哪一个是第213行?@PritamBanerjee我在我的问题中说过,抛出新的SQLException(errorMessages)代码>如果您使用catch块来抑制异常,那么抛出会破坏这一点。打印堆栈跟踪以找出是什么导致它被抛出。在调试器中单步执行/over方法可能会向您显示一些额外的信息(您可以查看变量值并创建观察者)。第二个查询有错误,因此我更正了它并运行程序。我不知道现在是否可以在一个查询中写入。然而,这e.printStackTrace()代码>非常有用。多谢各位!第二个查询有错误,所以我更正了它,然后程序运行。我不知道现在是否可以在一个查询中写入。然而,这e.printStackTrace()代码>非常有用。多谢各位!