2010-09-26 247 views
12

Estoy tratando de insertar algunas filas en una tabla ... Estoy usando postgressql-7.2.jar.Excepción de Postgres: la consulta no devolvió ningún resultado.

tengo la siguiente excepción

org.postgresql.util.PSQLException: No hay resultados fueron devueltos por la consulta.
en org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery (AbstractJdbc2Statement.java:255)

ya he buscado en Google y las posibles razones sugeridas son

  1. Uso executeUpdate() método o execute() método en lugar de executeQuery() método.

  2. Esto podría deberse a un problema en el recipiente; prueba otras versiones de tarros de postgres.

  3. En algunos lugares lo guardan podría ser debido a un error de espacio en el montón.

He intentado todas las tres soluciones, pero ninguna funciona ...

No estoy pegando el código desde que ha estado en uso statement.executeUpdate(queryString). inserte las declaraciones cargue los datos en la tabla, pero todavía consigo este error.

¿Puede alguien ayudarme en esto?

+2

Publique más de su código - Pondré dinero en el error causado por su código en lugar del controlador. – duffymo

Respuesta

4

Este código funciona perfectamente para mí ejecutando PostgreSQL 8.1 y su controlador. Tal vez puede ser una plantilla para encontrar lo que está mal con los suyos.

Necesita una sola tabla llamada PERSON con las columnas PERSON_ID, FIRST_NAME, LAST_NAME. Creé PERSON_ID la clave primaria autoincrementada.

package persistence; 

import java.sql.*; 
import java.util.*; 

public class DatabaseUtils 
{ 
    private static final String DEFAULT_DRIVER = "org.postgresql.Driver"; 
    private static final String DEFAULT_URL = "jdbc:postgresql://localhost:5432/party"; 
    private static final String DEFAULT_USERNAME = "pgsuper"; 
    private static final String DEFAULT_PASSWORD = "pgsuper"; 

    public static void main(String[] args) 
    { 
     String driver = ((args.length > 0) ? args[0] : DEFAULT_DRIVER); 
     String url = ((args.length > 1) ? args[1] : DEFAULT_URL); 
     String username = ((args.length > 2) ? args[2] : DEFAULT_USERNAME); 
     String password = ((args.length > 3) ? args[3] : DEFAULT_PASSWORD); 

     Connection connection = null; 

     try 
     { 
      connection = createConnection(driver, url, username, password); 
      DatabaseMetaData meta = connection.getMetaData(); 
      System.out.println(meta.getDatabaseProductName()); 
      System.out.println(meta.getDatabaseProductVersion()); 

      String sqlQuery = "SELECT PERSON_ID, FIRST_NAME, LAST_NAME FROM PERSON ORDER BY LAST_NAME"; 
      System.out.println("before insert: " + query(connection, sqlQuery, Collections.EMPTY_LIST)); 

      connection.setAutoCommit(false); 
      String sqlUpdate = "INSERT INTO PERSON(FIRST_NAME, LAST_NAME) VALUES(?,?)"; 
      List parameters = Arrays.asList("Foo", "Bar"); 
      int numRowsUpdated = update(connection, sqlUpdate, parameters); 
      connection.commit(); 

      System.out.println("# rows inserted: " + numRowsUpdated); 
      System.out.println("after insert: " + query(connection, sqlQuery, Collections.EMPTY_LIST)); 
     } 
     catch (Exception e) 
     { 
      rollback(connection); 
      e.printStackTrace(); 
     } 
     finally 
     { 
      close(connection); 
     } 
    } 

    public static Connection createConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException 
    { 
     Class.forName(driver); 

     if ((username == null) || (password == null) || (username.trim().length() == 0) || (password.trim().length() == 0)) 
     { 
      return DriverManager.getConnection(url); 
     } 
     else 
     { 
      return DriverManager.getConnection(url, username, password); 
     } 
    } 

    public static void close(Connection connection) 
    { 
     try 
     { 
      if (connection != null) 
      { 
       connection.close(); 
      } 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 


    public static void close(Statement st) 
    { 
     try 
     { 
      if (st != null) 
      { 
       st.close(); 
      } 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void close(ResultSet rs) 
    { 
     try 
     { 
      if (rs != null) 
      { 
       rs.close(); 
      } 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void rollback(Connection connection) 
    { 
     try 
     { 
      if (connection != null) 
      { 
       connection.rollback(); 
      } 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static List<Map<String, Object>> map(ResultSet rs) throws SQLException 
    { 
     List<Map<String, Object>> results = new ArrayList<Map<String, Object>>(); 

     try 
     { 
      if (rs != null) 
      { 
       ResultSetMetaData meta = rs.getMetaData(); 
       int numColumns = meta.getColumnCount(); 
       while (rs.next()) 
       { 
        Map<String, Object> row = new HashMap<String, Object>(); 
        for (int i = 1; i <= numColumns; ++i) 
        { 
         String name = meta.getColumnName(i); 
         Object value = rs.getObject(i); 
         row.put(name, value); 
        } 
        results.add(row); 
       } 
      } 
     } 
     finally 
     { 
      close(rs); 
     } 

     return results; 
    } 

    public static List<Map<String, Object>> query(Connection connection, String sql, List<Object> parameters) throws SQLException 
    { 
     List<Map<String, Object>> results = null; 

     PreparedStatement ps = null; 
     ResultSet rs = null; 

     try 
     { 
      ps = connection.prepareStatement(sql); 

      int i = 0; 
      for (Object parameter : parameters) 
      { 
       ps.setObject(++i, parameter); 
      } 

      rs = ps.executeQuery(); 
      results = map(rs); 
     } 
     finally 
     { 
      close(rs); 
      close(ps); 
     } 

     return results; 
    } 

    public static int update(Connection connection, String sql, List<Object> parameters) throws SQLException 
    { 
     int numRowsUpdated = 0; 

     PreparedStatement ps = null; 

     try 
     { 
      ps = connection.prepareStatement(sql); 

      int i = 0; 
      for (Object parameter : parameters) 
      { 
       ps.setObject(++i, parameter); 
      } 

      numRowsUpdated = ps.executeUpdate(); 
     } 
     finally 
     { 
      close(ps); 
     } 

     return numRowsUpdated; 
    } 
} 
+0

No hay nada de malo en este ejemplo, y esa es la parte triste al respecto. Hombre, recuerdo ahora por qué uso las clases JdbcTemplate/SimpleJdbcTemplate que proporciona Spring: ¿podrían haber hecho que JDBC fuera más detestable si realmente intentaran hacerlo? – MetroidFan2002

+0

Me gusta Spring también, MetroidFan2002. Triste, de hecho. 8) – duffymo

2

¿Qué tipo de instrucción SQL está tratando de ejecutar con executeQuery()? No debe ser un INSERT o UPDATE; estas no son consultas.

Sin publicar la declaración de SQL real, las muestras de código o la apariencia de la tabla, es bastante difícil ayudarlo con su problema. Sin detalles, todo lo que podemos hacer es adivinar.

+0

No estoy utilizando executeQuery .... Estoy usando executeUpdate() y estoy tratando de insertar en la tabla –

+0

executeUpdate() cambia una fila que ya existe, ¿no? –

+0

@ Balaji, parece indicar en su pregunta sobre el uso de ambos, que es un poco confuso. ¿Puedes simplemente publicar una muestra de código y la declaración SQL? Los campos reales, los nombres de las tablas, etc. son irrelevantes, estos pueden ofuscarse si esto es lo que le preocupa. ¿Puedo preguntar por qué está utilizando una versión tan antigua del controlador JDBC de Postgres? [Esta página] [http://jdbc.postgresql.org/download.html] indica que incluso el controlador JDBC de Postgres más nuevo es compatible con 7.2.Tal vez hay un error en el controlador? –

1

Una instrucción que inserta filas no devuelve ninguna fila como resultado, a diferencia de un SELECCIONAR.

Cuestiones relacionadas