2013-05-15 3 views
5

Мне было трудно это понять. Сначала у меня есть метод insertProduct(Product p), который должен проверить, существует ли продукт с указанным кодом в базе данных. Если это так, этот метод отобразит сообщение об ошибке. В противном случае он должен добавить продукт в базу данных и распечатать его на консоли. Я не уверен, правильно ли я это делаю.Исключение Java SQL Неверное состояние курсора - нет текущей строки

Во-вторых, метод deleteProduct(Product p) должен удалить продукт, который был добавлен методом insertProduct. Теперь дело в том, что я продолжаю получать исключение SQL при попытке добавить продукт, а затем метод просто продолжает удалять продукты, которые находятся в базе данных один за другим, каждый раз, когда программа запускается до тех пор, пока не останется. Я не уверен, что не так с обоими этими методами.

Консоль вывода:

Derby has been started. 

Product list: 
bvbn Murach's Beginning Visual Basic .NET  $49.50 
cshp Murach's C#         $49.50 
java Murach's Beginning Java      $49.50 
jsps Murach's Java Servlets and JSP    $49.50 
mcb2 Murach's Mainframe COBOL     $59.50 
sqls Murach's SQL for SQL Server     $49.50 
zjcl Murach's OS/390 and z/OS JCL    $62.50 

First product: 
bvbn Murach's Beginning Visual Basic .NET  $49.50 

Last product: 
zjcl Murach's OS/390 and z/OS JCL    $62.50 

Product by code: cshp 
cshp Murach's C#         $49.50 

Insert test: 
java.sql.SQLException: Invalid cursor state - no current row. 
Product list: 
bvbn Murach's Beginning Visual Basic .NET  $49.50 
cshp Murach's C#         $49.50 
java Murach's Beginning Java      $49.50 
jsps Murach's Java Servlets and JSP    $49.50 
mcb2 Murach's Mainframe COBOL     $59.50 
sqls Murach's SQL for SQL Server     $49.50 
zjcl Murach's OS/390 and z/OS JCL    $62.50 

Delete test: 
zjcl Murach's OS/390 and z/OS JCL    $62.50 

Product list: 
bvbn Murach's Beginning Visual Basic .NET  $49.50 
cshp Murach's C#         $49.50 
java Murach's Beginning Java      $49.50 
jsps Murach's Java Servlets and JSP    $49.50 
mcb2 Murach's Mainframe COBOL     $59.50 
sqls Murach's SQL for SQL Server     $49.50 

Derby has been shut down. 

Код:

import java.sql.*; 

public class DBTesterApp 
{ 
private static Connection connection = null; 
private static Product p = null ; 
public static void main(String args[]) 
{ 
    // get the connection and start the Derby engine 
    connection = MurachDB.getConnection(); 
    if (connection != null) 
     System.out.println("Derby has been started.\n"); 

    // select data from database 
    printProducts(); 
    printFirstProduct(); 
    printLastProduct(); 
    printProductByCode("cshp"); 

    // modify data in the database 
    p = new Product("test", "Test Product", 49.50);   
    insertProduct(p); 
    printProducts(); 

    deleteProduct(p); 
    printProducts(); 

    // disconnect from the database 
    if (MurachDB.disconnect()) 
     System.out.println("Derby has been shut down.\n"); 
} 

public static void printProducts() 
{ 

    // Product p = null ; 
    try (Statement statement = connection.createStatement(); 
     ResultSet rs = statement.executeQuery("SELECT * FROM Products")) 
    {    


     System.out.println("Product list:"); 
     while(rs.next()) 
     { 
      String code = rs.getString("ProductCode"); 
      String description = rs.getString("Description"); 
      double price = rs.getDouble("Price"); 

     p = new Product(code, description, price); 

      printProduct(p); 
     } 
     System.out.println(); 
    } 
    catch(SQLException e) 
    { 
     e.printStackTrace(); // for debugging 
    } 
    } 

    public static void printFirstProduct() 
    { 

    try(Statement statement = connection.createStatement(
      ResultSet.TYPE_SCROLL_SENSITIVE, 
      ResultSet.CONCUR_UPDATABLE); 

     ResultSet rs = statement.executeQuery("SELECT * FROM Products")){ 

     System.out.println("First product:"); 

     rs.first(); 
     rs.last(); 

     if(rs.isFirst() == false){ 
      rs.previous(); 
     } 

     if(rs.isLast() == false){ 
      rs.next(); 
     } 

     rs.absolute(1); 
     String code = rs.getString(1); 
     String description = rs.getString(2); 
     double price = rs.getDouble(3); 

     p = new Product(code , description , price); 
     printProduct(p); 
     System.out.println(); 
    } 

    catch(SQLException e){ 
      e.printStackTrace(); 
     } 
    } 

public static void printLastProduct() 
{ 
    try(Statement statement = connection.createStatement(
      ResultSet.TYPE_SCROLL_SENSITIVE, 
      ResultSet.CONCUR_UPDATABLE); 

     ResultSet rs = statement.executeQuery("SELECT * FROM Products")){ 
     System.out.println("Last product:"); 


     rs.first(); 
     rs.last(); 

     if(rs.isFirst() == false){ 
      rs.previous(); 
     } 

     if(rs.isLast() == false){ 
      rs.next(); 
     } 

     rs.absolute(7); 
     String code = rs.getString(1); 
     String description = rs.getString(2); 
     double price = rs.getDouble(3); 

     p = new Product(code, description, price); 
     printProduct(p); 
     System.out.println(); 



    } 

    catch(SQLException e){ 
     e.printStackTrace(); 
    } 
} 

    public static void printProductByCode(String productCode) 
    { 

     String sql = 
      "SELECT ProductCode, Description, Price " + 
      "FROM Products " +  
      "WHERE ProductCode = ?"; 

    try(PreparedStatement ps = connection.prepareStatement(sql);){ 

     ps.setString(1, productCode); 
     ResultSet rs = ps.executeQuery(); 

     if(rs.next()){ 
     String description = rs.getString("Description"); 
     double price = rs.getDouble("Price"); 
     p = new Product(productCode, description, price); 
     System.out.println("Product by code: " + productCode); 
     printProduct(p); 
     } 
      else{ 
      rs.close(); 
       } 

    } 


    catch(SQLException e){ 
    System.err.println(e); 

    } 


    System.out.println(); 
    } 

    public static void insertProduct(Product p) 
    { 
    System.out.println("Insert test: "); 


    //check if product code exists in database 
    try(Statement statement = connection.createStatement(); 
     ResultSet rs = statement.executeQuery("SELECT * FROM Products")){ 

    String code = rs.getString(1); 


    if (p.getCode().equals(code)){ 
     System.out.println("Error: This product is already in the database!"); 
     } 


    else{ 
    String sql = 
      "INSERT INTO Products (productCode, Description, Price) " + 
      "VALUES (?, ?, ?)"; 

    try(PreparedStatement ps = connection.prepareStatement(sql)){ 


     ps.setString(1, p.getCode()); 
     ps.setString(2, p.getDescription()); 
     ps.setDouble(3, p.getPrice()); 
     ps.executeUpdate(); 
     } 


    catch(SQLException e){ 
      System.err.println(e); 
     } 


    } //end else 

     printProduct(p); 
    System.out.println(); 

    }//end try 


     catch(SQLException e){ 
     System.out.println(e); 
     } 
} 

private static void deleteProduct(Product p) 
{ 
    System.out.println("Delete test: "); 

    String sql = "DELETE FROM Products " + 
       "WHERE ProductCode = ?"; 

    try(PreparedStatement ps = connection.prepareStatement(sql)){ 
     ps.setString(1, p.getCode()); 
     ps.executeUpdate(); 

    } 

    catch(SQLException e){ 
     System.err.println(e); 
    } 
    // add code that deletes the specified product from the database 
    // if a product with the specified code doesn't exist, display an error message 

    printProduct(p); 
    System.out.println(); 
} 

// use this method to print a Product object on a single line 
private static void printProduct(Product p) 
{ 
    String productString = 
     StringUtils.padWithSpaces(p.getCode(), 8) + 
     StringUtils.padWithSpaces(p.getDescription(), 44) + 
     p.getFormattedPrice(); 

    System.out.println(productString); 
} 
} 

ответ

6

Прежде чем вы сможете получить значение столбца, вам необходимо позвонить ResultSet.next().

// check if product code exists in database 
try(Statement statement = connection.createStatement(); 
    ResultSet rs = statement.executeQuery("SELECT * FROM Products")){ 
if (rs.next()) // THIS is MISSING! 
    String code = rs.getString(1); 

Приведенный выше код будет работать без исключений, но все равно не логично, так как вы выбираете все продукты и просто проверить код первого зафиксированного в базе данных. правильно способ проверить, если продукт уже существует,

// check if product code exists in database 
try(Statement statement = connection.createStatement(); 
    ResultSet rs = statement.executeQuery(
     "SELECT * FROM Products WHERE ProductCode = '" + p.getCode() + "'")){ 
if (rs.next()) { 
    System.out.println("Error: This product is already in the database!"); 
    return; 
} 
+0

Я попробовал это, но теперь я получаю это: 'java.sql.SQLSyntaxErrorException: Колонка«TEST»либо не в какой-либо таблицы в ОТ список или отображается в спецификации соединения и выходит за рамки спецификации соединения или появляется в предложении HAVING и не находится в списке GROUP BY. Если это инструкция CREATE или ALTER TABLE, тогда «TEST» не является столбцом в целевой таблице. « – oxxi

+0

Вот как я изменил метод: http://pastebin.com/wPBq0Jpf – oxxi

+0

Вы все еще пропустили удаление' rs .getString (1); '. Это просто выше, где вы добавили 'rs.next()'. Проверка остальных. –

0

В вашем методе insertProduct, необходимо вызвать следующий метод() на вашем ResultSet перед получением из него данные.