ResultSet MetaData不返回第一行

时间:2013-04-14 21:04:01

标签: java sql jdbc metadata

此代码返回除第一行之外的每一行。我看不出有什么问题吗?我怎么能把它包括在内呢?

stmt = con.createStatement();  

ResultSet res=stmt.executeQuery("SELECT * FROM Orders ORDER BY OrderID");

if (res.next())
{
    ResultSetMetaData rsmd=res.getMetaData();
    int columnCount=rsmd.getColumnCount();
    for (int i = 1; i<= columnCount; i++) {
        columnHeading=columnHeading+"\t"+rsmd.getColumnName(i); 
    }
    System.out.println(columnHeading);
    while(res.next()) {
        for (int i= 1; i<= columnCount; i++) {                            
            System.out.print("\t"+res.getString(i));
        }
    System.out.println("\n");
    }
}

5 个答案:

答案 0 :(得分:2)

您正在拨打res.next()两次 - 一次在此处:

if (res.next())

并且在这里:

while (res.next())

if语句和while语句之间,您正在“查看”第一行 - 但是当您进入while循环体时,您就是已经在第二排了。

最简单的修复可能是改变:

while (res.next())
{
}

要:

do
{
} while (res.next());

答案 1 :(得分:0)

当您致电ResultSet时,您正在移动if(res.next)

这意味着当您进入循环时,您已经排成一行。

将循环更改为do-while

do {

} while (res.next());

这将在第一次循环调用next之前运行代码

答案 2 :(得分:0)

res.next()会自动移动结果集。你先在if语句中调用它,然后在打印任何行之前再次在while语句中调用它,并且在打印任何内容之前调用它两次,就会丢失第一行

while更改为do..while,这应该可以按照您的意愿进行。

答案 3 :(得分:0)

试试这个。我希望它能奏效。

stmt = con.createStatement();  

ResultSet res=stmt.executeQuery("SELECT * FROM Orders ORDER BY OrderID");

if (res != null)
{
ResultSetMetaData rsmd=res.getMetaData();
int columnCount=rsmd.getColumnCount();
for (int i = 1; i<= columnCount; i++) {
    columnHeading=columnHeading+"\t"+rsmd.getColumnName(i); 
}
System.out.println(columnHeading);
while(res.next()) {
    for (int i= 1; i<= columnCount; i++) {                            
        System.out.print("\t"+res.getString(i));
    }
 System.out.println("\n");
 }
}

答案 4 :(得分:-1)

这里的问题是ResultSet的索引不以0开头。因此 如果您尚未全局声明ResultSet,则必须按以下方式写入: ResultSet res = null; 否则它会起作用。