【问题标题】:SELECT query with ResultSet arguments in JAVA [duplicate]在 JAVA 中使用 ResultSet 参数选择查询 [重复]
【发布时间】:2018-03-07 18:40:34
【问题描述】:

我的Oracle数据库的服务器代码包含两个文件(类),即:Main.javaDBManager.javaDBManager.java 包含 SQLPRocessingSQLProcess 方法(函数),它们分别使用查询语句执行 executeUpdateexecuteQuery 操作。用于转储和获取数据的 SQL 查询写在 Main.java 类中。我的数据库包含两个表T1T2。我的代码有两个用于插入数据的查询:

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} 

那么它不会产生任何错误。但是,客户端设备不会从服务器获取任何数据。我该如何解决?

【问题讨论】:

  • 无论您实际使用哪种 DBMS,您都需要在访问 bobby 表之前使用参数化查询。此外,您应该开始使用 ANSI-92 样式的连接,它们已经存在超过 25 年了。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/…
  • 我想知道;所有参数都作为String发送给方法,为什么将它们转换为Double?

标签: java sql sql-server oracle sql-query-store


【解决方案1】:

您是否检查过 (T1.ID = T2.ID) 是否存在彼此相等的 ID?否则,您的查询响应为空,因为您的 where 案例拒绝了结果。

有时在第一个位置会有一个额外的列。那么可能你的数据没有正确插入?

【讨论】:

  • 是的,他们是平等的。
  • insert 和 select 之间是否调用了任何 db 函数?也许你的 db 对象不一样?
  • 我解决了这个问题。我将 ResultSet 变量初始化为某个值,直到它得到正确的值,这样它在任何时候都不会为空。谢谢。
【解决方案2】:

我认为,使用 Double 或 Float 进行 id 是一个问题,因为精度始终是个问题。 简单地说,当您保存浮点数时,例如 7.2,它可能表示为 7.199999 或 7.199998 或 7.2000001 等,因此 id 将不相等。 对于 id,我建议使用整数或类似 UUID 的东西。

【讨论】:

  • 你认为主键会这样保存在数据库中吗:7.199998?
  • 不过,你说得对,他为什么要把参数转换成 Double?
  • 这取决于几个因素,但如果主键数据类型是双精度,则可能是这样,因为 Double.parseDouble(ID) 可能会为同一个字符串提供不同的结果。我前段时间在比较看似相同的坐标时遇到了这样的问题。
  • 好吧,对于作者来说,不能说,使用 double 可以获得什么好处。尽管在这种情况下使用 String (varchar) 作为主键可能仍然是一个有效的想法。
  • 我把 ID 改成整数,还是一样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 2016-05-07
相关资源
最近更新 更多