【问题标题】:java database connection retrievaljava数据库连接检索
【发布时间】:2011-03-08 18:31:08
【问题描述】:

我正在使用下面的代码以摇摆形式显示我的数据库中的记录。但是,当我点击按钮时,它只显示数据库的第一条记录(数据库中的表有 5 条记录)

private void btnnextActionPerformed(java.awt.event.ActionEvent evt) {                                        
    try
        {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection con=DriverManager.getConnection("jdbc:odbc:StudentDetails");
            Statement stm=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            ResultSet rs=stm.executeQuery("Select * from NurseryStDetails");

                if(rs.first())
                {
                    txtstID.setText(rs.getString(1));
                    txtname.setText(rs.getString(2));
                    txtaddress.setText(rs.getString(3));
//                    int i=rs.getInt(4);
//                    String s=String.valueOf(i);
//                    txtage.setText(rs.getString(s));
//                    int j=rs.getInt(5);
//                    String t=String.valueOf(j);
                    txtage.setText(rs.getString(4));
                    txttelephone.setText(rs.getString(5));
                    txtgNIC.setText(rs.getString(6));
                    txtgname.setText(rs.getString(7));
                }
            }
        catch(Exception ex)
            {
                System.out.println("Exception caught"+ex);
            }

    }   

【问题讨论】:

    标签: java swing jdbc


    【解决方案1】:

    JDBC ResultSet 对象可以被视为指向正在执行的查询的结果行开始之前的位置。 第一个 rs.next() 使其指向返回的第一行。随后对 rs.next() 的调用将其在结果行中向前移动。 因此,要显示所有结果,请使用该概念

    while(rs.next()){
      //use rs to get the details of the current row.
    }
    

    如果下一行存在,rs.next() 返回真。

    【讨论】:

      【解决方案2】:

      嗯,您确实是这样编写代码的。这是JavadocResultSet#first() 的引用:

      将光标移动到此 ResultSet 对象的第一行。

      返回: true 如果光标位于有效行上; false 如果结果集中没有行。

      你看,它所做的就是将光标移动到第一行。仅此而已。

      您基本上需要在while 循环中将其替换为ResultSet#next()。只要有一行,它就会遍历所有行。

      while (rs.next()) {
          // ...
      }
      

      但是还有另一个问题。如果您进行 only 更改,则代码最终将仅显示 last 行的数据,因为您正在重用 same每次的文本组件。您希望在 UI 的新字段中分别显示每一行。我不做 Swing,所以我无法给出详细的答案,但我至少知道你想使用 JTable 来解决这个问题。

      另见:


      也就是说,您的代码中还有其他问题。

      1. 无需每次都调用Class#forName()。在应用程序启动期间只需一次即可。
      2. 不在finally 块内对ResultSetStatementConnection 调用close() 将导致资源泄漏。如果您继续长期运行它,数据库迟早会耗尽连接,您的应用程序将无法再连接它并中断。相应地修复它。
      3. 仅仅打印ex 并不能提供有价值的信息。它只会打印在调试过程中不是很有帮助的异常类型和消息。你想改用ex.printStackTrace()

      【讨论】:

        【解决方案3】:

        是吗

        if(rs.first()) ??
        

        试试

        while (rs.next())
        

        这将帮助您遍历结果集。

        【讨论】:

        • no 那么它只显示在表格的最后一条记录中。以前它只显示第一条记录
        • 您一次又一次地更新同一个字段......因此它只显示最后一个值。可能您需要根据您的要求显示文本字段数组。您可以在 while 循环内动态创建文本字段或将结果值存储在数组中并将其传递给您拥有文本字段数组的 Swing 客户端
        【解决方案4】:

        如果(rs.first())

        检查你是否在结果集中的第一条记录

        【讨论】:

          猜你喜欢
          • 2012-04-06
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 2016-09-04
          • 1970-01-01
          • 2021-08-17
          相关资源
          最近更新 更多