2017-12-16 9 views
1

Ich habe ein Problem mit der Zeile pstmt.setLong(1, id);. Ich bekomme einen Fehler, dass der Wert für die Parameternummer 1 nicht festgelegt ist. Wenn ich die Zeichenfolge SQL ohne das Fragezeichen verwende, funktioniert es. Auch, wenn ich ARM verwenden die PreparedStatement und ResultSet nicht automatisch geschlossen, so muss ich sie schließen, und schließlich scheint nichtcom.microsoft.sqlserver.jdbc.SQLServerException: Der Wert ist nicht für die Parameternummer eingestellt 1

@Override 
public Company getCompany(long id) { 
    Connection con = ConnectionPool.getInstance().getConnection(); 
    String sql = "SELECT * FROM Company WHERE ID=?"; 
    //String sql = "SELECT * FROM Company WHERE ID=" + id; 
    Company company = new Company(); 
    try ( 
     PreparedStatement pstmt = con.prepareStatement(sql); 
     ResultSet rs = pstmt.executeQuery();) 
     { 
     pstmt.setLong(1, id); 
     if (rs.next()) { 
      company.setId(rs.getLong(1)); 
      company.setCompName(rs.getString(2)); 
      company.setPassword(rs.getString(3)); 
      company.setEmail(rs.getString(4)); 
     } else { 
      System.out.println("Company with ID: " + id + " could not be found\n"); 
     } 
     pstmt.close(); 
     rs.close(); 
    } catch (SQLException e) { 
     CouponSystemException ex = new CouponSystemException("Company with ID: " + id + " could not be retrieved\n", e); 
     System.out.println(ex.getMessage()); 
     System.out.println(e); 
    } 
    ConnectionPool.getInstance().returnConnection(con); 
    return company; 
} 

Antwort

1

Den Parameter zu arbeiten, bevor die Abfrage ausgeführt wird. Sie müssen Statement- und Resultsets, die in try-with-resource-Anweisungen definiert sind, auch nicht schließen, da sie beim Verlassen des try-Bereichs automatisch geschlossen werden.

try(PreparedStatement pstmt = con.prepareStatement(sql)) { 
    pstmt.setLong(1, id); 
    try(ResultSet rs = pstmt.executeQuery()) { 
     // do stuff 
    } 
} 
1

Sie müssen die PreparedStatement ‚s Parameter vor Ausführung um sie einzustellen. Beachten Sie auch, dass Sie die Try-with-Resource-Syntax verwenden, Sie sollten die Ressourcen nicht selbst schließen:

try (PreparedStatement pstmt = con.prepareStatement(sql)) { 
    pstmt.setLong(1, id); 
    try (ResultSet rs = pstmt.executeQuery()) { 
     if (rs.next()) { 
      company.setId(rs.getLong(1)); 
      company.setCompName(rs.getString(2)); 
      company.setPassword(rs.getString(3)); 
      company.setEmail(rs.getString(4)); 
     } else { 
      System.out.println("Company with ID: " + id + " could not be found\n"); 
     } 
    } 
} catch (SQLException e) { 
    CouponSystemException ex = new CouponSystemException("Company with ID: " + id + " could not be retrieved\n", e); 
    System.out.println(ex.getMessage()); 
    System.out.println(e); 
} 
Verwandte Themen