Java JDBC-ODBC问题-Resultset.getString()在有值时返回null

Java JDBC-ODBC问题-Resultset.getString()在有值时返回null,java,jdbc,odbc,Java,Jdbc,Odbc,首先,这是我在WindowsVista、Windows7和WindowsServer2008上遇到的问题,但在XP和Server2003上没有 我知道,在WindowsServer2003和WindowsVista之间,微软将MDAC(我们提供的是2.8版)更改为WDAC6.0,我认为我的问题就在那堆热气腾腾的库中 我有一条SQL语句:“SELECT TermStates.actualcoff FROM TermStates WHERE TermStates.AnalID='000X'ORDER

首先,这是我在WindowsVista、Windows7和WindowsServer2008上遇到的问题,但在XP和Server2003上没有

我知道,在WindowsServer2003和WindowsVista之间,微软将MDAC(我们提供的是2.8版)更改为WDAC6.0,我认为我的问题就在那堆热气腾腾的库中

我有一条SQL语句:“SELECT TermStates.actualcoff FROM TermStates WHERE TermStates.AnalID='000X'ORDER BY TermStates.indx ASC”,它返回一列数据,其中假设没有值可以为Null。这些值的精度很高,大多数都很小(即接近零),也可能是负数

第一组数据值如下所示:

results = statement.executeQuery(sql);
if(results != null)
{
    ResultSetMetaData metaData = results.getMetaData();
    ArrayList rowList = new ArrayList();

    String colType = metaData.getColumnTypeName(1);
    Object obj = null;
    if(colType.equals("DOUBLE"))
    {
        obj = null;
        String fValue = results.getString(1);
        if(fValue != null && fValue.length() > 0)
        {
            obj = new Double(fValue);
        }
        else
        {
            obj = new Double(0.0);
        }
    }
    else
    {
        obj = results.getString(1);
    }
    rowList.add(obj);
}
-1.31182339008657
4.53959374804032
8.9828426279767
-0.0742423578308
1.90497874662919
-0.966443915857118
0.16964205760622
-0.825467091179711
-0.206287563886913
-1.00269723837058
-1.30688278976707
0.236262277634983
0
0
0
0.108773852550276
0
0
0 -0.0922931225677525
0
0.217813798294512

第二组是这样的:

results = statement.executeQuery(sql);
if(results != null)
{
    ResultSetMetaData metaData = results.getMetaData();
    ArrayList rowList = new ArrayList();

    String colType = metaData.getColumnTypeName(1);
    Object obj = null;
    if(colType.equals("DOUBLE"))
    {
        obj = null;
        String fValue = results.getString(1);
        if(fValue != null && fValue.length() > 0)
        {
            obj = new Double(fValue);
        }
        else
        {
            obj = new Double(0.0);
        }
    }
    else
    {
        obj = results.getString(1);
    }
    rowList.add(obj);
}
-1.6359065334839
-0.9565335083171
9.91635261365054
-0.135820145149139
-3.2385711942924
-1.1562654250619
0.174470946581009
0
0
-1.13424407912293
0
1.0795237314308
0
0
0
0.132662710394659
0
0
0
-0.0899603109525667
0
0

有更多的数据列,它们都表现出相同的问题。如果返回的数字以“-0.0X”开头,则results.getString()函数将返回null

基本代码如下所示:

results = statement.executeQuery(sql);
if(results != null)
{
    ResultSetMetaData metaData = results.getMetaData();
    ArrayList rowList = new ArrayList();

    String colType = metaData.getColumnTypeName(1);
    Object obj = null;
    if(colType.equals("DOUBLE"))
    {
        obj = null;
        String fValue = results.getString(1);
        if(fValue != null && fValue.length() > 0)
        {
            obj = new Double(fValue);
        }
        else
        {
            obj = new Double(0.0);
        }
    }
    else
    {
        obj = results.getString(1);
    }
    rowList.add(obj);
}
有人在JDBC-ODBC桥上见过这样的行为吗?我在这种环境中工作了很多年,没有任何问题,但这一点让我感到困惑。“-0.0X”的位对齐是否表明64位和32位库之间存在问题,或者?如果你们能帮上忙,我们将不胜感激


Chris

只需使用
结果。getDouble(1)

为什么不使用
results.getDouble(1)
?这实际上会引发异常,因此在某些方面更糟糕。此代码也用于其他情况,因为null是一个可能的值,所以仅输入零是不合适的。@Chris:getDouble
getDouble
引发什么异常?另外,
ResultSet.wasNull()
用于基本类型列可能为
null
的情况。我自己为此创建了一些包装器方法。。。他们调用
getInt
getDouble
或其他任何函数,然后如果
wasNull()
true
则返回
null
,否则返回值。@ColinD:我肯定能找到解决错误的方法,但我的问题是,我需要那个字段中的数字,或者对这个数据进行复杂的数字运算,会提供虚假的数据。正在检查wasNull()的确切错误和返回值。@ColinD:尝试获取BigDecimal的异常为SQLException:未找到数据。异常处理程序中的result.wasNull()返回false。相同的gor getDouble()。在这种情况下,getDouble(1)将抛出错误。我还尝试了getBigDecimal和其他一些可能的解决方法。Java代码似乎无法从给定行的DB中提取任何值。如果getDouble(1)抛出错误,您可能没有向我们显示所有内容,或者ODBC桥严重损坏,因为getDouble(1)是从结果集(即所有内容)中获取双值的唯一可靠方法。这段代码在数百个部署上运行,每次安装时都会对数字进行数千次解析。直到Vista/7/2008,问题才开始出现。@a_hores_和_no_name:JDBC-ODBC桥在access数据库上运行时,您是否有过不能两次查询相同结果的经验?我在Google上看到过一些闲聊,还记得大约8年前我写这段代码时遇到过类似的问题。我刚刚用getObject(1)替换了getString(1),并且能够将以前不起作用的值转换为String()。从ResultSet的Javadocs中可以看出:“为了最大的可移植性,每行中的结果集列应该按从左到右的顺序读取,并且每列应该只读取一次”