2013-05-15 8 views
5

私はこれを理解しようとしています。まず、指定されたコードを持つ製品がデータベースに存在するかどうかを確認する、insertProduct(Product p)メソッドがあります。その場合、このメソッドはエラーメッセージを表示します。それ以外の場合は、製品をデータベースに追加してコンソールに出力する必要があります。私が正しくそれをしているかどうかはわかりません。Java SQL例外無効なカーソル状態 - 現在の行なし

第2に、deleteProduct(Product p)メソッドは、insertProductメソッドで追加された製品を削除することになっています。今は、製品を追加しようとするとSQL例外が発生し続けることになり、メソッドは、プログラムが実行されるたびに、データベースが1つずつ削除されたままになります。これらの方法の両方で何が問題なのかよく分かりません。

コンソール出力:

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. 

コード:あなたのinsertProduct方法で

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

上記のコードは、例外なしで実行しますが、あなたはすべての製品を選択するだけのデータベースによって返された最初のもののためのコードをチェックしているので、まだ論理的に失敗していました。 `java.sql.SQLSyntaxErrorException:列「TEST」のFROMのいずれかではない任意のテーブルにある製品がすでに存在するかどうかを確認するために正しいの方法は、私はそれを試してみましたが、今、私はこれを取得

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

です結合仕様の範囲外であるか、HAVING節に現れ、GROUP BYリストには含まれていません。これがCREATEまたはALTER TABLEステートメントの場合、 'TEST'はターゲット表の列ではありません。 ' – oxxi

+0

メソッドの変更方法は次のとおりです。http://pastebin.com/wPBq0Jpf – oxxi

+0

'rs .getString(1); '。これは 'rs.next()'を追加したところです。残りを確認する。 –

0

、あなたはそれからデータをフェッチする前に、あなたのResultSetのnext()メソッドを呼び出す必要があります。

関連する問題