SELECT 在 JAVA 中使用 ResultSet 参数进行查询
SELECT query with ResultSet arguments in JAVA
我的 Oracle 数据库的服务器代码包含两个文件 (classes),即:Main.java
和 DBManager.java
。 DBManager.java
包含 SQLPRocessing
和 SQLProcess
方法(函数),分别对查询语句执行 executeUpdate
和 executeQuery
操作。 SQL 转储和获取数据的查询写在 Main.java
class。我的数据库包含两个表 T1
和 T2
。我的代码有两个插入数据的查询:
public void SQLProcessing(String ID, String X, String Y, String XE, String YE){
db.SQLProcess("INSERT INTO T1 VALUES("+Double.parseDouble(ID)+ "," +Double.parseDouble(X)+ "," +Double.parseDouble(Y)+")");
db.SQLProcessing("INSERT INTO T2 VALUES("+Double.parseDouble(ID)+ "," +Double.parseDouble(XE)+ "," +Double.parseDouble(YE)+")");
}
同样,为了从数据库取回数据,我使用单个 SELECT 查询作为:
public ResultSet SQLProcess(String msg1, String msg2, String msg3, String msg4, String msg5){
ResultSet rs = db.SQLProcess("SELECT * FROM T1, T2 WHERE T1.ID = T2.ID");
return rs;
}
执行代码时出现错误:
Exception in thread "Thread-1" java.lang.NullPointerException at Main.sendTo(Main.java:132) at Main$ServerReceiver.run(Main.java:79)
Main.java 的第 132 行包含 while(rs.next())
,第 79 行包含 sendTo(socket.getInetAddress());
。但是,当我看到数据库时,数据已发送并存储在数据库中。所以,我认为问题出在 SELECT
查询上。我尝试了来自不同线程的许多可能的 SELECT 查询,我无法解决问题。我的猜测正确吗?有人可以为我的案例提供真实的 SELECT 查询吗?还是错误是由其他来源触发的?
问题出在光标上。它是空的,我添加了一个 if
语句作为:
if(rs!=null) {
while(rs.next()){//code}
那么它不会产生任何错误。但是,客户端设备不会从服务器获取任何数据。我该如何解决?
您是否检查过 (T1.ID = T2.ID
) 是否存在彼此相等的 ID?否则您的查询响应为空,因为您的 where case 拒绝了结果。
有时在第一位会有一个额外的列。那么也许您的数据没有正确插入?
我想,在这里使用 Double 或 Float 作为 id 是一个问题,因为精度总是有问题的。
简单地说,当你保存一个浮点数时,比如 7.2,它可能表示为 7.199999 或 7.199998 或 7.2000001 等,因此 ids 将不相等。
对于 id,我建议使用整数或类似 UUID 的东西。
我的 Oracle 数据库的服务器代码包含两个文件 (classes),即:Main.java
和 DBManager.java
。 DBManager.java
包含 SQLPRocessing
和 SQLProcess
方法(函数),分别对查询语句执行 executeUpdate
和 executeQuery
操作。 SQL 转储和获取数据的查询写在 Main.java
class。我的数据库包含两个表 T1
和 T2
。我的代码有两个插入数据的查询:
public void SQLProcessing(String ID, String X, String Y, String XE, String YE){
db.SQLProcess("INSERT INTO T1 VALUES("+Double.parseDouble(ID)+ "," +Double.parseDouble(X)+ "," +Double.parseDouble(Y)+")");
db.SQLProcessing("INSERT INTO T2 VALUES("+Double.parseDouble(ID)+ "," +Double.parseDouble(XE)+ "," +Double.parseDouble(YE)+")");
}
同样,为了从数据库取回数据,我使用单个 SELECT 查询作为:
public ResultSet SQLProcess(String msg1, String msg2, String msg3, String msg4, String msg5){
ResultSet rs = db.SQLProcess("SELECT * FROM T1, T2 WHERE T1.ID = T2.ID");
return rs;
}
执行代码时出现错误:
Exception in thread "Thread-1" java.lang.NullPointerException at Main.sendTo(Main.java:132) at Main$ServerReceiver.run(Main.java:79)
Main.java 的第 132 行包含 while(rs.next())
,第 79 行包含 sendTo(socket.getInetAddress());
。但是,当我看到数据库时,数据已发送并存储在数据库中。所以,我认为问题出在 SELECT
查询上。我尝试了来自不同线程的许多可能的 SELECT 查询,我无法解决问题。我的猜测正确吗?有人可以为我的案例提供真实的 SELECT 查询吗?还是错误是由其他来源触发的?
问题出在光标上。它是空的,我添加了一个 if
语句作为:
if(rs!=null) {
while(rs.next()){//code}
那么它不会产生任何错误。但是,客户端设备不会从服务器获取任何数据。我该如何解决?
您是否检查过 (T1.ID = T2.ID
) 是否存在彼此相等的 ID?否则您的查询响应为空,因为您的 where case 拒绝了结果。
有时在第一位会有一个额外的列。那么也许您的数据没有正确插入?
我想,在这里使用 Double 或 Float 作为 id 是一个问题,因为精度总是有问题的。 简单地说,当你保存一个浮点数时,比如 7.2,它可能表示为 7.199999 或 7.199998 或 7.2000001 等,因此 ids 将不相等。 对于 id,我建议使用整数或类似 UUID 的东西。