movimiento conjunto de resultados cursor hacia adelante y hacia atrás en una aplicación de JDBC

Estoy trabajando en un Inventario de software del Sistema que se conecta a un servidor Ms Sql server mediante una conexión ODBC JDBC. Quiero mover el Conjunto de resultados cursor a la siguiente fila y hacia atrás. La conexión de trabajos y el programa puede recuperar los campos de la base de datos, así que no hay problema con eso.

El código que tengo aquí es una en un botón denominado «Siguiente». Cuando haga clic en este botón, se debe avanzar a la siguiente fila en la base de datos y recuperar los datos de esa fila. Los datos recuperados se deben mostrar en los «campos de texto». El problema es que cuando hago clic en siguiente no pasa nada?

    private void NextBtnActionPerformed(java.awt.event.ActionEvent evt) {                                        
    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbc");
        Connection con;
        con = DriverManager.getConnection("jdbc:odbc:StockInventory","sa","123");           

        Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
        String query = "select * from Stocktbl";

        ResultSet rs; 
        rs = stmt.executeQuery(query); 


        if(!rs.isLast()) {
            rs.next();

            TxtStockid.setText(rs.getString("StockId"));
            TxtItem.setText(rs.getString("ItemName"));
            TxtQuantity.setText(rs.getString("Quantity"));
            TxtUnitprice.setText(rs.getString("UnitPrice"));
            TxtNetprice.setText(rs.getString("NetPrice"));
            TxtUnitweight.setText(rs.getString("UnitWeight"));
            TxtNetweight.setText(rs.getString("Netweight"));
            TxtDescription.setText(rs.getString("Description"));
        }

        rs.close();
        stmt.close();
        con.close();




    } 
    catch (SQLException ex) 
    {
        Logger.getLogger(StockScr.class.getName()).log(Level.SEVERE, null, ex);
    }
    catch (ClassNotFoundException ex) 
    {
        Logger.getLogger(StockScr.class.getName()).log(Level.SEVERE, null, ex);
    }       
}

Aquí está el resto de la codificación del programa, El botón «Siguiente» que se añade a este Panel.

public class StockScr extends javax.swing.JPanel {
ResultSet rs;
Connection con = null;

public StockScr() {
    initComponents();
    ShowTable();

}

void ShowTable(){
    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbc");
        Connection con;
        con = DriverManager.getConnection("jdbc:odbc:StockInventory","sa","123");           

        Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
        String query = "select * from Stocktbl";           
        ResultSet rs; 
        rs = stmt.executeQuery(query);

        rs.first();
            TxtStockid.setText(rs.getString("StockId"));
            TxtItem.setText(rs.getString("ItemName"));
            TxtQuantity.setText(rs.getString("Quantity"));
            TxtUnitprice.setText(rs.getString("UnitPrice"));
            TxtNetprice.setText(rs.getString("NetPrice"));
            TxtUnitweight.setText(rs.getString("UnitWeight"));
            TxtNetweight.setText(rs.getString("Netweight"));
            TxtDescription.setText(rs.getString("Description"));

        rs.close();
        stmt.close();
        con.close();

    } 
    catch (SQLException ex) 
    {
        Logger.getLogger(StockScr.class.getName()).log(Level.SEVERE, null, ex);
    }
    catch (ClassNotFoundException ex) 
    {
        Logger.getLogger(StockScr.class.getName()).log(Level.SEVERE, null, ex);
    }        
}


public void fetchResultSet()
{

try {
    if(con==null || con.isClosed())
    {
      Class.forName("sun.jdbc.odbc.JdbcOdbc");
      con = DriverManager.getConnection("jdbc:odbc:StockInventory","sa","123");           
    }
    Statement stmt =     con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
    String query = "select * from Stocktbl";
    rs = stmt.executeQuery(query); 
  }catch(Exception ex){
     System.out.println(ex);
     Logger.getLogger(StockScr.class.getName()).log(Level.SEVERE, null, ex); 
  }

     try
     {
        if(con != null)
        {
          con.close();
        }
     }catch(Exception ex){

     }

}


private void NextBtnActionPerformed(java.awt.event.ActionEvent evt) {

try
{

 if (rs == null)
 {
    fetchResultSet();
 }

 if (rs!=null)
 {
    if (rs.next())
    {
        TxtStockid.setText(rs.getString("StockId"));
        TxtItem.setText(rs.getString("ItemName"));
        TxtQuantity.setText(rs.getString("Quantity"));
        TxtUnitprice.setText(rs.getString("UnitPrice"));
        TxtNetprice.setText(rs.getString("NetPrice"));
        TxtUnitweight.setText(rs.getString("UnitWeight"));
        TxtNetweight.setText(rs.getString("Netweight"));
        TxtDescription.setText(rs.getString("Description"));         
    }
   else
   {
      rs = null;
   }
 }
}catch(Exception ex){
  System.out.println(ex); 
  }        
}
  • ¿Por qué está usted de establecer la conexión y la recuperación de datos cada vez que su Next clic en el botón?
  • En realidad quiero ser capaz de hacer clic en el botón siguiente y se deben recuperar los datos de la siguiente fila en el databae y mostrar que en un textfield. No estoy seguro de si tengo que establecer de nuevo la conexión para eso o no?
InformationsquelleAutor Anafam | 2013-04-04

4 Kommentare

  1. 3

    Debe crear la Conexión a la base de datos y buscar un nuevo record sólo una vez antes de que usted hace clic next botón. Y, a continuación, seguir adelante utilizando rs.next en NextBtnActionPerformed método.

    Por ejemplo, usted debe tener una llamada al método fetchResultSet como sigue y que debe ser llamada antes denext clic en el botón.

    ResultSet rs;
    Connection con = null;
    public void fetchResultSet()
    {
    
       try {
            if(con==null || con.isClosed())
            {
              Class.forName("sun.jdbc.odbc.JdbcOdbc");
              con = DriverManager.getConnection("jdbc:odbc:StockInventory","sa","123");           
            }
            Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            String query = "select * from Stocktbl";
            rs = stmt.executeQuery(query); 
          }catch(Exception ex)
          {
             System.out.println(ex);
             Logger.getLogger(StockScr.class.getName()).log(Level.SEVERE, null, ex);
    
             try
             {
                if(con != null)
                {
                  con.close();
                }
             }catch(Exception x){}
          }
    }

    Y, a continuación, su NextBtnActionPerformed debe ser como este:

    private void NextBtnActionPerformed(java.awt.event.ActionEvent evt)
    {
      try
      {
         if (rs == null)
         {
            fetchResultSet();
         }
         if (rs!=null)
         {
            if (rs.next())
            {
                TxtStockid.setText(rs.getString("StockId"));
                TxtItem.setText(rs.getString("ItemName"));
                TxtQuantity.setText(rs.getString("Quantity"));
                TxtUnitprice.setText(rs.getString("UnitPrice"));
                TxtNetprice.setText(rs.getString("NetPrice"));
                TxtUnitweight.setText(rs.getString("UnitWeight"));
                TxtNetweight.setText(rs.getString("Netweight"));
                TxtDescription.setText(rs.getString("Description"));         
            }
           else
           {
              rs = null;
           }
         }
      }catch(Exception ex){System.out.println(ex);}
    }
    • mi Netbeans ide me está dando un error en esta línea if(con != null) «variable con que no podría haber sido inicializado»
    • sí debería haber inicializado con el valor..Ver mis actualizaciones. He hecho un cambio más ..Connection con está declarada como variable miembro..por lo que no es creado cada vez que fetchResultSet se llama..
    • Hice click en siguiente, pero «no» pasar a la siguiente registro y mi consola salidas: java.sql.SQLException: ResultSet is closed
    • Es algún error de impresión dentro de su Logger archivo? hacer el Exception ex para ser impreso en fetchResultSet método también..
    • sí, el registrador de archivo es la impresión de algunos errores, debo publicar?
    • LOL, el registrador de archivos es muy grande… Bad Checksum - idPage: 458754, tyPage: 0, iPage: 18 Bad Checksum - idPage: 458757, tyPage: 0, iPage: 19 Bad Checksum - idPage: 786433, tyPage: 5, iPage: 24 Bad Checksum - idPage: 851990, tyPage: 1, iPage: 22 pero aquí está la última de las 4 líneas de código
    • Apenas dar alguna pista..lol..es mejor Que me digas la excepción imprime en la consola para fetchResultSet método. Ver mi código actualizado..me han hecho la Exception para imprimir en la consola dentro de fetchResultSet método.
    • la línea de Logger.getLogger(StockScr.class.getName()).log(Level.SEVERE, null, ex); necesita un } llave de cierre y me encontré con el programa, pero todavía no se mueve al siguiente registro. La consola de salidas de nuevo: java.sql.SQLException: ResultSet is closed
    • hacer el check out actualizado mi post anterior para obtener información adicional.
    • Está usted usando el método que he publicado en mi respuesta.. ??
    • sí, por supuesto, esto es sólo el código original que tenía antes. Ya he agregado el fetchResultSet() método para este programa.
    • bien, acabo de actualizar lo que el programa parece mirar como ahora…por CIERTO, hay otros métodos de esta clase que no he incluido por el bien de la simplicidad, pero estos métodos funciona a la perfección y tienen muy poco impacto en el resto de la codificación.
    • No estoy viendo ningún cambio…El post es igual a como estaba..me preguntó por el nuevo código que se escribió utilizando mi código..por lo que pude ver el sintáctica del problema si alguno en su nuevo código..
    • Hice la actualización con tu código, plz actualizar su navegador. Es el segundo campo de código en el post. Usted sólo tiene que desplazarse hacia abajo un poco para verlo 🙂
    • null, ex); } quitar } de esta línea.. y añadir un extra de } en el último de este método.
    • He quitado el } y se añade al final de la fetchResultSet() método, pero ahora me sale un error en la línea }catch(Exception ex){ dice «variable ex ya está definido en el método de fetchResultSet()»
    • mi error.. cambiar el catch(Exception ex) a catch(Exception e) después de con.close() declaración.

  2. 2

    Usted necesita llamar a rs.next() antes de puede llamar rs.isLast(). La llamada a rs.isLast() no ofrece mucho en términos de funcionalidad:

    if (rs.next()) {
        TxtStockid.setText(rs.getString("StockId"));
        ...

    Con este enfoque, no eres el avance de la ResultSet cursor para obtener los mismos datos cada vez que hace clic en un botón. Un WHERE cláusula sería necesario devolver una diferentes fila. Si la cantidad total de registros no es grande, el almacenamiento en caché de los datos sería el enfoque preferido.

    De almacenamiento en caché es adecuada cuando la cantidad de elementos es relativamente pequeña y gran escala, no es necesario. En este caso, usted puede cargar todos los datos en un ArrayList<MyStockItem> en el inicio y navegar a pesar de que el List en lugar de hacer conexiones de base de datos. Productos tales como EHCache son útiles para este propósito.

    • traté de hacerlo de esta forma, como usted ha dicho muchas veces pero no funciona
    • ¿1) Recuperar los datos? 2) Si usted va con este enfoque, usted tendrá que utilizar una cláusula where para obtener el siguiente registro disponible. Si la cantidad total de registros no es grande, el almacenamiento en caché de los datos podría parecer una buena solución.
    • No recuperar ningún dato en absoluto, más bien se queda en el mismo registro(1 registro), el cual fue establecido previamente en los campos de texto utilizando un código de trabajo en el programa. No estoy seguro de cómo iba a aplicar una cláusula where. Sólo hay 5 registros agregados hasta ahora
    • Yo diría que la caché de todos los datos en un ArrayList<MyStockItem> al inicio, a continuación, navegar a través de clic de botón. Esto es menos costoso, a continuación, consultar la base de datos cada vez.
    • que de cosas chulas, pero me temo que tengo que hacer esta aplicación utilizando una conexión JDBC. «Es un requisito» 🙂
  3. 1

    Crear nuevo conjunto de resultados en cada botón, haga clic en. Lo nuevo conjunto de resultados tiene el cursor en la primera posición y es por eso que siempre se obtiene el mismo registro mientras hace clic en él. Para resolverlo se necesita crear conjunto de resultados de campo, a continuación, rellenar con registros en la clase principal’ constrcutor y luego operar en este conjunto de resultados.

    • No hay Principal constructor de la clase es sólo una simple clase que se llama «StockScr» que se extiende JPanel. por ejemplo: public class StockScr extends JPanel El Botón Siguiente se agrega a este Panel, utilizando Netbeans la vista diseño.
    • Así lo cree en StockScr del constructor, que es lo que yo pensaba decir de la clase principal. De todos modos, el problema es como he descrito – crear nuevo conjunto de resultados en cada acción realizada.
  4. 0

    Debe utilizar

    while(rs.next())  instead of if(!rs.isLast())  and then rs.next()

    No creo que resultset proporcionar la api para mover hacia atrás. La pregunta es ¿por qué lo necesita.

    • LOL, Si me pueden hacer avanzar al siguiente registro en la base de datos, estoy bastante seguro de que puede hacer lo mismo por compatibilidad de codificación en el botón «Anterior».
    • por cierto ya he probado while(rs.next()) y todo lo que hace es mover hasta el último registro.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea