为啥 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() 光标常见错误总结分析