为啥 java.sql.ResultSet 的“getFloat(column)”方法不返回任何内容,而其他方法则返回?

Posted

技术标签:

【中文标题】为啥 java.sql.ResultSet 的“getFloat(column)”方法不返回任何内容,而其他方法则返回?【英文标题】:Why the "getFloat(column)" method of java.sql.ResultSet does not return anything while other methods do?为什么 java.sql.ResultSet 的“getFloat(column)”方法不返回任何内容,而其他方法则返回? 【发布时间】:2019-07-26 16:55:13 【问题描述】:

我是 Java 服务器端编程的初学者,我编写了一个示例程序,它从数据库表中获取记录并在控制台上打印它们。因此,我在数据库中创建了一个包含 3 列类型 INT、VARCHAR 和 FLOAT 的表,并在其中输入了一些数据。在 JDBC 代码中,前两种类型的数据已成功获取,即 getInt(col) 和 getString(col),但 getFloat(col) 没有返回任何内容,即使表中存在数据。我已经仔细检查了数据库中的类型,但没有任何帮助。

如果我尝试单独编写 getFloat(col) 方法(即不在循环中),它工作得非常好。

while(rs.next())  //"rs" is the ResultSet object
  for(int i=1; i<=noc; i++)   // "noc" is rs.getColumnCount()
    switch(rsmd.getColumnType(i))  // "rsmd" is the ResultSetMetaData object
    case Types.VARCHAR :
        System.out.print(rs.getString(i));
        break;
    case Types.INTEGER :
        System.out.print(rs.getInt(i));
        break;
    case Types.FLOAT :
            System.out.print(rs.getFloat(i));
        break;
    
    System.out.println();
    


/*
If I write like below, it works fine

rs.next();
System.out.println(rs.getFloat(3));

but it doesn't work as in the above code
*/

我希望输出是一个完整的记录表,但我得到的是一个缺少“FLOAT”类型列数据的表。我不明白我做错了什么。

The output I was getting on the console

【问题讨论】:

并且您确定该列是FLOAT,或者更准确地说,getColumnType 真的返回FLOAT?而不是NUMERIC 左右......无论如何,将default 添加到至少带有错误消息、日志记录或抛出异常的开关也不错...... 是的,我确定是因为我创建了包含 INT、VARCHAR 和 FLOAT 列的表。 我没有问你是如何创建表的,我问的是 getColumnType 的返回值 - 驱动程序可能正在将数据库 FLOAT 映射到一些不同的类型(“* getColumnType 真的返回 FLOAT *"(假设 i==3 不工作,getFloat(3) 应该没有理由工作而 getFloat(i) 不工作) @HarshaBharadwaz,证明给自己看。添加println 以查看列类型是什么。例如,在 Oracle(我知道这不是您的数据库)中,使用 INTEGER 列创建的表实际上只是 NUMBER 的一个特例,并且将在数据字典中显示为 NUMBER。如果你的结果是 NUMBER 的某种风格,请注意某些数字类型最终在 Java 中被处理为 BigDecimal 是的,我现在明白了,它实际上是一个真实的类型。谢谢。 【参考方案1】:

但是 getFloat(col) 没有返回任何东西

它不能返回 nothing。即使它返回一个null 值,你也会得到打印。如果什么也没得到,那是因为 print 语句没有执行。

最可能的原因是 getColumnType() 返回 REAL(或 DOUBLE),而不是 FLOAT。尝试将这些添加到 switch 语句中以查看。

还要在switch 中添加default:,以至少打印一些内容,例如将此添加到 switch 语句的末尾:

default:
    System.out.print("Unexpected type: " + rsmd.getColumnType(i));

这将是您学习如何调试您自己的代码的好时机。通过调试,您将了解所有这些,比您在这里写问题要快得多。见:

What is a debugger and how can it help me diagnose problems? How to debug small programs

【讨论】:

getFloat 将返回 0 以获得 null 值。 @MarkRotteveel 是的。我更想说的是,即使一个方法返回 nothing(又名null),你也会得到文本null 打印,而不是nothing。打印 nothing 的唯一方法是方法返回空(或空白)字符串。

以上是关于为啥 java.sql.ResultSet 的“getFloat(column)”方法不返回任何内容,而其他方法则返回?的主要内容,如果未能解决你的问题,请参考以下文章

一次性获取`java.sql.ResultSet`行中的所有值

java.sql.ResultSet、CallableStatement、SQLInput 没有通用接口

如何从 java.sql.ResultSet 获取列名列表 [重复]

java.sql.ResultSet.next() 光标常见错误总结分析

java.sql.ResultSet 在增加列长度后返回修剪后的字符串

JDBC结果集