在 JDBC 中查看 ResultSet 时不检索记录 [重复]

Posted

技术标签:

【中文标题】在 JDBC 中查看 ResultSet 时不检索记录 [重复]【英文标题】:Doesn't retrieve the records while viewing a ResultSet in JDBC [duplicate] 【发布时间】:2016-01-04 02:04:47 【问题描述】:

现在我正在学习 java 中的 ResultSet 类型。在这里,我编写了用于以不同方式查看记录的代码。起初我显示了 emp4 表中的全部记录,然后我开始以不同的方式查看这些记录(最后,第一,下一个)这正是我正在寻找的,但它不会显示呈现的所有记录在 emp4 表中。请参阅第一个程序它不起作用,但如果我记录了第 41 行(请参阅第二个程序中的这个),它工作得很棒。有什么问题 ?我的代码有什么问题吗???

代码示例 1

package demojdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class mysqlCon

private static final String DB_DRIVER = "com.mysql.jdbc.Driver";
private static final String DB_CONNECTION = "jdbc:mysql://localhost:3306/vinoth";
private static final String DB_USER = "root";
private static final String DB_PASSWORD = "vino";

    public static void main(String args[])throws SQLException

        //Creating statement and connection 
        Connection dbConnection = null;
        Statement stmt = null;

        try

            //Creating class driver
            Class.forName(DB_DRIVER);

            //Creating Database Connection
            dbConnection = DriverManager.getConnection(DB_CONNECTION,DB_USER,DB_PASSWORD);

            //Creating statement
            stmt = dbConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

            //Creating query
            String sql = "SELECT id,gmail,yahoo from emp4";

            //Creating ResultSet
            ResultSet rs = stmt.executeQuery(sql);

            //Displaying database
            System.out.println("Displaying records before doing some operations");
            System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString(3));

            System.out.println("Displaying records for last row");
            rs.last();

            int id = rs.getInt("id");
            String gmail = rs.getString("gmail");
            String yahoo = rs.getString("yahoo");

            //Displaying records in last row
            System.out.println("ID : "+id);
            System.out.println("GMAIL : "+gmail);
            System.out.println("YAHOO : "+yahoo);

            System.out.println();
            rs.first();
            System.out.println("Displaying records for first row");

            id = rs.getInt("id");
            gmail = rs.getString("gmail");
            yahoo = rs.getString("yahoo");

            //Displaying records in last row
            System.out.println("ID : "+id);
            System.out.println("GMAIL : "+gmail);
            System.out.println("YAHOO : "+yahoo);

            System.out.println();
            rs.next();
            System.out.println("Displaying records for next row");

            id = rs.getInt("id");
            gmail = rs.getString("gmail");
            yahoo = rs.getString("yahoo");

            //Displaying records in last row
            System.out.println("ID : "+id);
            System.out.println("GMAIL : "+gmail);
            System.out.println("YAHOO : "+yahoo);

        catch(SQLException e)

            e.printStackTrace();

        catch(ClassNotFoundException e)

             System.out.println("Plese check the driver class path "+e.getMessage());

        finally

            if(stmt != null)

                stmt.close();

            
            if(dbConnection != null)

                dbConnection.close();

            
        
    

在这里,代码可以正常工作.....

代码示例 2

package demojdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class MysqlCon

private static final String DB_DRIVER = "com.mysql.jdbc.Driver";
private static final String DB_CONNECTION = "jdbc:mysql://localhost:3306/vinoth";
private static final String DB_USER = "root";
private static final String DB_PASSWORD = "vino";

    public static void main(String args[])throws SQLException

        //Creating statement and connection 
        Connection dbConnection = null;
        Statement stmt = null;

        try

            //Creating class driver
            Class.forName(DB_DRIVER);

            //Creating Database Connection
            dbConnection = DriverManager.getConnection(DB_CONNECTION,DB_USER,DB_PASSWORD);

            //Creating statement
            stmt = dbConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

            //Creating query
            String sql = "SELECT id,gmail,yahoo from emp4";

            //Creating ResultSet
            ResultSet rs = stmt.executeQuery(sql);

            //Displaying database
            System.out.println("Displaying records before doing some operations");
           //System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString(3));

            System.out.println("Displaying records for last row");
            rs.last();

            int id = rs.getInt("id");
            String gmail = rs.getString("gmail");
            String yahoo = rs.getString("yahoo");

            //Displaying records in last row
            System.out.println("ID : "+id);
            System.out.println("GMAIL : "+gmail);
            System.out.println("YAHOO : "+yahoo);

            System.out.println();
            rs.first();
            System.out.println("Displaying records for first row");

            id = rs.getInt("id");
            gmail = rs.getString("gmail");
            yahoo = rs.getString("yahoo");

            //Displaying records in last row
            System.out.println("ID : "+id);
            System.out.println("GMAIL : "+gmail);
            System.out.println("YAHOO : "+yahoo);

            System.out.println();
            rs.next();
            System.out.println("Displaying records for next row");

            id = rs.getInt("id");
            gmail = rs.getString("gmail");
            yahoo = rs.getString("yahoo");

            //Displaying records in last row
            System.out.println("ID : "+id);
            System.out.println("GMAIL : "+gmail);
            System.out.println("YAHOO : "+yahoo);

        catch(SQLException e)

            e.printStackTrace();

        catch(ClassNotFoundException e)

             System.out.println("Plese check the driver class path "+e.getMessage());

        finally

            if(stmt != null)

                stmt.close();

            
            if(dbConnection != null)

                dbConnection.close();

            
        
    

输出

显示最后一行的记录 编号:5 GMAIL : 纳文 雅虎:naveenrockz

显示第一行的记录 编号:1 GMAIL : 葡萄酒 雅虎:vinothasd

显示下一行的记录 编号:2 GMAIL : ajithvirje 雅虎:ajith234

请让我明白。为什么我的代码在 CODE SAMPLE 1 Program 中没有获取任何记录?

下图表示emp4表中的以下记录

【问题讨论】:

如何向我们展示一个堆栈跟踪或第一个运行不正确的代码的输出? 是的,它不起作用。它只是显示了一个像这样的异常“java.sql.SQLException:在结果集开始之前”,但是如果我评论第 41 行,那么它可以正常工作......但我想提取这些数据并想在去之前显示它执行操作(最后,第一,下一个) 【参考方案1】:

原因是在使用getInt() / getString() 访问数据之前,您还没有通过调用next() 使ResultSet 的光标前进。试试这样的:

//Creating ResultSet
ResultSet rs = stmt.executeQuery(sql);

//Displaying database
System.out.println("Displaying records before doing some operations");

if (rs.next())         
    System.out.println(rs.getInt(1) + " "
        + rs.getString(2) + " " + rs.getString(3));

如果您想遍历整个结果集,请改用while (rs.next())

您的第二个代码 sn-p 有效,因为您在第一次访问列值之前将光标移动到 rs.last() 的最后一个位置。

请注意,在访问列值之前,您应该始终检查 rs.next() / rs.last() / rs.first() 方法的返回值。错误的返回值表示结果集没有行,并且在调用结果集的任何 getter(rs.getInt()/rs.getString() 等)方法时会引发异常。

【讨论】:

非常感谢.....它真的很好用,这是我现在所期待的,它没有任何问题,但我怀疑?为什么它不适用于我发布的那条线,但它仅适用于 while 或 if ?为什么?两者都一样只知道?还是不? 我已编辑问题以解释您的第二个代码示例为何有效。基本上,对ResultSetgetX 方法的任何调用都需要在一个移动光标的方法之前。 这对我很有帮助。再次感谢您的帮助!!!【参考方案2】:

你需要使用.next()函数跳转到结果集中的第一条记录

while(rs.next())
        System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString(3));        

【讨论】:

感谢您的努力...

以上是关于在 JDBC 中查看 ResultSet 时不检索记录 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 JDBC ResultSet 映射到对象

JDBC ResultSet源码解读

JDBC ResultSet源码解读

JDBC ResultSet源码解读

JDBC ResultSet源码解读

如何使用 JDBC 检索数据