2013-05-15 6 views
5

Ich habe versucht, eine harte Zeit, um dies herauszufinden. Zuerst habe ich eine insertProduct(Product p) Methode, die überprüfen soll, ob ein Produkt mit dem angegebenen Code in der Datenbank existiert. Wenn dies der Fall ist, zeigt diese Methode eine Fehlermeldung an. Andernfalls sollte das Produkt der Datenbank hinzugefügt und auf der Konsole gedruckt werden. Ich bin mir nicht sicher, ob ich das richtig mache.Java SQL-Ausnahme ungültiger Cursor-Status - keine aktuelle Zeile

Zweitens soll die deleteProduct(Product p) Methode das Produkt löschen, das durch die insertProduct Methode hinzugefügt wurde. Jetzt ist die Sache, dass ich immer eine SQL-Ausnahme erhalte, wenn ich versuche, das Produkt hinzuzufügen, und dann die Methode löscht nur die Produkte, die in der Datenbank eins nach dem anderen sind, jedes Mal, wenn das Programm ausgeführt wird, bis keine übrig sind. Ich bin mir nicht sicher, was mit diesen beiden Methoden nicht stimmt.

Konsolenausgabe:

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. 

Code:

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); 
} 
} 

Antwort

6

Sie müssen ResultSet.next() aufrufen, bevor Sie einen Spaltenwert abrufen können.

// 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); 

Der obige Code würde ohne Ausnahmen laufen würde aber immer noch logisch scheitern, da Sie alle Produkte sind die Auswahl und nur den Code für die erste von der Datenbank zurücküberprüft. Die korrekte Möglichkeit zu überprüfen, ob das Produkt bereits vorhanden ist

// 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

ich versuchte, aber jetzt bekomme ich dies: 'java.sql.SQLSyntaxErrorException: Spalte‚TEST‘ist entweder nicht in einer Tabelle in der FROM Liste oder erscheint innerhalb einer Join-Spezifikation und ist außerhalb des Bereichs der Join-Spezifikation oder erscheint in einer HAVING-Klausel und ist nicht in der GROUP BY-Liste. Wenn dies eine Anweisung CREATE TABLE oder ALTER ist dann ‚TEST‘ ist keine Spalte in dem Ziel table.' – oxxi

+0

Hier ist, wie ich die Methode geändert: http://pastebin.com/wPBq0Jpf – oxxi

+0

Sie noch haben Entfernen verpaßt 'rs .getString (1); '. Es ist genau darüber, wo Sie die 'rs.next()' hinzugefügt haben. Überprüfen Sie den Rest. –

0

In Ihrem insert Methode, müssen Sie die nächste() -Methode auf dem ResultSet aufrufen, bevor Daten von ihm zu holen.

Verwandte Themen