Java jdbc ResultSet.get<;数据类型>;返回空值
所以我有以下问题。 我有一个Java应用程序,它通过jdbc连接到红移数据库。执行一个简单的SELECT查询将生成一个不为null的结果集(我选中了) 现在,当我尝试从这个ResultSet提取数据时,该方法有时会返回null,即使以前的ResultSet.wasnull()返回false,并且在数据库中手动检查也会发现相关记录不包含该属性的null值 示例代码:Java jdbc ResultSet.get<;数据类型>;返回空值,java,jdbc,amazon-redshift,Java,Jdbc,Amazon Redshift,所以我有以下问题。 我有一个Java应用程序,它通过jdbc连接到红移数据库。执行一个简单的SELECT查询将生成一个不为null的结果集(我选中了) 现在,当我尝试从这个ResultSet提取数据时,该方法有时会返回null,即使以前的ResultSet.wasnull()返回false,并且在数据库中手动检查也会发现相关记录不包含该属性的null值 示例代码: private void test(){ ResultSet rs = null; ResultSetMe
private void test(){
ResultSet rs = null;
ResultSetMetaData rsmd = null;
String getTable = "SELECT * from myTable"; //
try(PreparedStatement prep = myConnection.prepareStatement(getTable
, ResultSet.TYPE_FORWARD_ONLY
)){
rs = prep.executeQuery();
rsmd = rs.getMetaData();
int columns = rsmd.getColumnCount();
while(rs.next()){ // loop over all rows
for(int col = 1; col <= columns; col++){
if(rs.wasNull())
System.out.println("NULL Value detected!");
System.out.println("Column Name: " + rsmd.getColumnName(col));
System.out.println("Column value: " + rs.getString(col));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
private void test(){
结果集rs=null;
ResultSetMetaData rsmd=null;
String getTable=“从myTable中选择*”//
try(PreparedStatement prep=myConnection.prepareStatement(getTable
,ResultSet.TYPE_FORWARD_仅限
)){
rs=准备执行();
rsmd=rs.getMetaData();
int columns=rsmd.getColumnCount();
while(rs.next()){//在所有行上循环
对于(int col=1;col,来自以下的javadoc:
报告上次读取的列的值是否为SQLNULL
。注意
您必须首先调用列上的一个getter方法来尝试
读取其值,然后调用方法wasNull
,查看
读取的值为SQLNULL
返回:
true
如果最后读取的列值是SQLNULL
否则为false
换句话说,您应该在读取列后使用它。请注意,对于对象类型,调用wasNull
是没有意义的,因为对象获取程序已经返回null
此方法旨在使用基本getter(如getInt()
)读取列时使用,因为对于null
值,这些getter将返回0
。然后可以使用wasNull()
检查该值是否真的0
或实际上null
换句话说,将代码更改为:
while(rs.next()){ // loop over all rows
for(int col = 1; col <= columns; col++){
String value = rs.getString(col);
if(value == null)
System.out.println("NULL Value detected!");
System.out.println("Column Name: " + rsmd.getColumnName(col));
System.out.println("Column value: " + value);
}
}
谢谢,我应该更仔细地阅读Javadoc。但是,重点仍然是我手动检查了数据库中有问题的字段,在那里我还发现不存在NULL,例如,我会找到一个非常合理的日期值,其中rs.getDate()简单返回null。@Flo我建议您发布一个新问题,该问题提供了一个复制该问题的方法。如果它是红移驱动程序中的一个错误,我会感到非常惊讶。我希望使用其他数据库或表之类的东西,然后您进行检查。我确实让应用程序通过System.out.println吐出了使用过的SELECT()并使用表的完全限定名将其粘贴到sql Workbench中。我还复制粘贴了DB url,并确保使用相同的凭据。我不知道如何检查错误的DB/表。在任何情况下,对于一个简单的示例,我还需要提供一个表,其中包含导致此行为的数据,而且我没有在我看来,这似乎完全是随机的,但当我建立自己的测试表时,不知何故,我似乎无法插入导致这些“不需要的空值”的数据@Flo在任何情况下,我都无法解决您的红移特定问题。我没有这方面的经验。我只是回答了不正确使用JDBC api导致的问题。
while(rs.next()){ // loop over all rows
for(int col = 1; col <= columns; col++){
String value = rs.getString(col);
if(rs.wasNull())
System.out.println("NULL Value detected!");
System.out.println("Column Name: " + rsmd.getColumnName(col));
System.out.println("Column value: " + value);
}
}