# What's wrong?



## padde479 (23. Jan 2006)

Hallo zusammen!

Ich habe ein Problem mit Servlets und MySQL. Ich übergebe an eine Methode einen Parameter, mit dem die Methode einen 'join' auf zwei Tabellen ausführen soll, und mir die Zeilen der Tabelle ausspuckt, die diesen Parameter enthalten. Hier der Quelltext:


```
public class InventoryDb {

  private static final String MAINTABLE = "INVENTORY";
  
  public static Object [] getAll(DbConnectionZentrale dbZentrale , String categoryid) 
  throws Exception{
	  PreparedStatement stmnt = null;
	  ResultSet resultSet           = null;
	  Vector inventoryList          = new Vector();
	  Connection connection     = null;
	  
	  try {
		  connection = dbZentrale.getConnection();
		  stmnt = connection.prepareStatement(
				  "SELECT i. * FROM " + 
				  dbZentrale.getSchemaname() + 
				  "." + MAINTABLE + " i," +
				  dbZentrale.getSchemaname() +
				  "." + CategoryDb.MAINTABLE + " c" + 
				  " WHERE i.CATEGORYID=c.CATEGORYID" + 
				  "AND c.CATEGORYID=" + categoryid);
		  resultSet  = stmnt.executeQuery();
		  
		  while (resultSet.next()){
			  // Category-Objekt erzeugen
			  Category category = CategoryDb.get(resultSet.getLong("CATEGORYID"), dbZentrale);
			  // Room-Objekt erzeugen
			  Room room = RoomDb.get(resultSet.getLong("ROOMID"), dbZentrale);
			  // Tradingpartner-Objekt erzeugen
			  Tradingpartner tradingpartner = TradingpartnerDb.get(resultSet.getLong("TRADINGPARTNERID"), dbZentrale);
			  // Ersteller-Objekt erzeugen
		      Steward owner = StewardDb.get(resultSet.getLong("OWNERID"), dbZentrale);
		      // Letzter Bearbeiter-Objekt erzeugen
		      Steward lastRedactor = StewardDb.get(resultSet.getLong("LASTREDACTORID"), dbZentrale);
		      
		      Date creationDate   = resultSet.getDate("CREATIONDATE");
		      Date lastUpdateDate = resultSet.getDate("LASTUPDATEDATE");
		      Inventory inventory = new Inventory(
		    		  resultSet.getLong("INVENTORYID"),
		    		  resultSet.getString("SERIALNUMBER"),
		    		  resultSet.getString("NAME"),
		    		  category,
		    		  room,
		    		  tradingpartner,
		    		  creationDate.getTime(),
		    		  owner, 
		    		  lastRedactor,
		    		  (lastUpdateDate == null ? 0 : lastUpdateDate.getTime()),
		    		  resultSet.getFloat("ACVISIONCOSTS"),
		    		  resultSet.getFloat("CURRENTCOSTS"),
		    		  resultSet.getString("INFO"));
		      // hinzufügen der Elemente
		      inventoryList.addElement(inventory);
		  }
	  }catch (Exception exception){
		  exception.printStackTrace();
		  throw new InventoryDbException();
	  }finally {
		  if (resultSet != null)
			  try {
				  resultSet.close();
			  }catch (Exception exception){
			  }
			  if (stmnt != null)
				  try {
					  stmnt.close();
				  }catch (Exception exception){
				  }
			  stmnt = null;
		  }
		  return inventoryList.toArray();
  }

  /**
   * Liefert alle Inventoryen aus der Datenbank zurück.
   * Die Variable istNeu ist nur zum Testen dar,
   * kann nach der richtigen Implementierung gelöscht werden.
   */
  public static Object[] getAll(DbConnectionZentrale dbZentrale) throws
    InventoryDbException {

    PreparedStatement stmnt = null;
    ResultSet rs = null;
    java.util.Vector inventoryenListe = new java.util.Vector();
    Connection connect = null;
    try {
      connect = dbZentrale.getConnection();
      stmnt = connect.prepareStatement(
          "SELECT * FROM " +
          dbZentrale.getSchemaname() +
          "." + MAINTABLE +
          " ORDER BY INVENTORYID");
      rs = stmnt.executeQuery();
      while (rs.next()) {
        // Category-Objekt erzeugen
        Category category = CategoryDb.get(rs.getLong("CATEGORYID"),dbZentrale);
        // Raum-Objekt erzeugen
        Room room = RoomDb.get(rs.getLong("ROOMID"), dbZentrale);
        // Handelspartner-Objekt erzeugen
        Tradingpartner tradingpartner = TradingpartnerDb.get(rs.getLong("TRADINGPARTNERID"),
          dbZentrale);
        // Ersteller-Objekt erzeugen
        Steward owner = StewardDb.get(rs.getLong("OWNERID"), dbZentrale);
        // Letzter Bearbeiter-Objekt erzeugen
        Steward lastRedactor = StewardDb.get(rs.getLong("LASTREDACTORID"), dbZentrale);

        java.sql.Date creationDate = rs.getDate("CREATIONDATE");
        java.sql.Date lastUpdateDate = rs.getDate("LASTUPDATEDATE");
       Inventory inventory = new Inventory(
           rs.getLong("INVENTORYID"),
           rs.getString("SERIALNUMBER"),
           rs.getString("NAME"),
           category, room,
           tradingpartner,
           creationDate.getTime(), owner,
           lastRedactor, (lastUpdateDate==null?0:lastUpdateDate.getTime()),
           rs.getFloat("ACVISIONCOSTS"),
           rs.getFloat("CURRENTCOSTS"),
           rs.getString("INFO"));
        inventoryenListe.addElement(inventory);
      }
    }
    catch (Exception e) {
      e.printStackTrace();
      throw new InventoryDbException();
    }
    finally {
      if (rs != null)
        try {
          rs.close();
        }
        catch (Exception ex) {
        }
      if (stmnt != null)
        try {
          stmnt.close();
        }
        catch (Exception ex) {
        }
        stmnt = null;
//      dbZentrale.freeConnection();
    }

    return inventoryenListe.toArray();
  }

  /**
   * Liefert einen Inventar aus der Datenbank zurück.
   */
  public static Inventory get(long id, DbConnectionZentrale dbZentrale) throws
    InventoryDbException {

    PreparedStatement stmnt = null;
    ResultSet rs = null;
    Connection connect = null;
    Inventory inventory = null;
    try {
      connect = dbZentrale.getConnection();
      stmnt = connect.prepareStatement(
          "SELECT * FROM " +
          dbZentrale.getSchemaname() +
          "." + MAINTABLE +
          " WHERE INVENTORYID=?");
      stmnt.setLong(1, id);
      rs = stmnt.executeQuery();
      if (rs.next()) {
        // Category-Objekt erzeugen
        Category category = CategoryDb.get(rs.getLong("CATEGORYID"),dbZentrale);
        // Raum-Objekt erzeugen
        Room room = RoomDb.get(rs.getLong("ROOMID"), dbZentrale);
        // Handelspartner-Objekt erzeugen
        Tradingpartner tradingpartner = TradingpartnerDb.get(rs.getLong("TRADINGPARTNERID"),
          dbZentrale);
        // Ersteller-Objekt erzeugen
        Steward owner = StewardDb.get(rs.getLong("OWNERID"), dbZentrale);
        // Letzter Bearbeiter-Objekt erzeugen
        Steward lastRedactor = StewardDb.get(rs.getLong("LASTREDACTORID"), dbZentrale);
        java.sql.Date creationDate = rs.getDate("CREATIONDATE");
        java.sql.Date lastUpdateDate = rs.getDate("LASTUPDATEDATE");
        inventory = new Inventory(
          rs.getLong("INVENTORYID"),
          rs.getString("SERIALNUMBER"),
          rs.getString("NAME"),
          category, room,
          tradingpartner,
          creationDate.getTime(), owner,
          lastRedactor, lastUpdateDate.getTime(),
          rs.getFloat("ACVISIONCOSTS"),
          rs.getFloat("CURRENTCOSTS"),
          rs.getString("INFO"));
      }
    }
    catch (Exception e) {
      e.printStackTrace();
      throw new InventoryDbException();
    }
    finally {
      if (rs != null)
        try {
          rs.close();
        }
        catch (Exception ex) {
        }
      if (stmnt != null)
        try {
          stmnt.close();
        }
        catch (Exception ex) {
        }
        stmnt = null;
//      dbZentrale.freeConnection();
    }

    return inventory;
  }

  /**
   * Speichert ein neues Inventar in der Datenbank
   */
  public int insert(Inventory inventory, DbConnectionZentrale dbZentrale)
    throws InventoryDbException {
    PreparedStatement stmnt = null;
    int verarbeitZeilen = 0;
    Connection connect = null;
    try {
      connect = dbZentrale.getConnection();
      // Transaktion starten:
      connect.setAutoCommit(false);

      // Update vorbereiten:
      stmnt = connect.prepareStatement(
          "INSERT " +
          dbZentrale.getSchemaname() +
          "." + MAINTABLE +
          "("+
          " NAME,SERIALNUMBER,TRADINGPARTNERID,"+
          " ROOMID,ACVISIONCOSTS,CURRENTCOSTS,"+
          " CATEGORYID,CREATIONDATE,OWNERID,"+
          " INFO)"+
          " VALUES (" +
          "?,?,?," +
          "?,?,?," +
          "?,?,?," +
          "?" +
          ")");
      // Werte setzen:
      stmnt.setString(1, inventory.getName());
      stmnt.setString(2, inventory.getSerialnumber());
      stmnt.setLong(3, inventory.getTradingpartnerId());

      stmnt.setLong(4, inventory.getRoomId());
      stmnt.setFloat(5, inventory.getAcvisionCosts());
      stmnt.setFloat(6, inventory.getCurrentCosts());

      stmnt.setLong(7, inventory.getCategoryId());
      stmnt.setDate(8, Datumformatierung.getDate(inventory.getCreationDate().getAsLong()));
      stmnt.setLong(9, inventory.getOwnerId());

      stmnt.setString(10, inventory.getInfo());
      // Insert ausführen
      verarbeitZeilen = stmnt.executeUpdate();

      // Transaktion beenden:
      connect.commit();
      connect.setAutoCommit(true);
    }
    catch (Exception e) {
      e.printStackTrace();
      throw new InventoryDbException();
    }
    finally {
      if (stmnt != null)
        try {
          stmnt.close();
        }
        catch (Exception ex) {
        }
        stmnt = null;
//      dbZentrale.freeConnection();
    }
    return verarbeitZeilen;
  }

  /**
   * Aktualisieren einer Inventory in der Datenbank.
   */
  public int update(Inventory inventory, DbConnectionZentrale dbZentrale)
    throws InventoryDbException {
    PreparedStatement stmnt = null;
    int verarbeitZeilen = 0;
    Connection connect = null;
    try {
      connect = dbZentrale.getConnection();
      // Transaktion starten:
      connect.setAutoCommit(false);

      // Update vorbereiten:
      stmnt = connect.prepareStatement(
          "UPDATE " +
          dbZentrale.getSchemaname() +
          "." + MAINTABLE +
          " SET"+
          " NAME=?,SERIALNUMBER=?,TRADINGPARTNERID=?,"+
          " ROOMID=?,ACVISIONCOSTS=?,CURRENTCOSTS=?,"+
          " CATEGORYID=?,CREATIONDATE=?,OWNERID=?,"+
          " LASTREDACTORID=?,LASTUPDATEDATE=?,INFO=?"+
          " WHERE INVENTORYID=?");
      // Werte setzen:
      stmnt.setString(1, inventory.getName());
      stmnt.setString(2, inventory.getSerialnumber());
      stmnt.setLong(3, inventory.getTradingpartnerId());

      stmnt.setLong(4, inventory.getRoomId());
      stmnt.setFloat(5, inventory.getAcvisionCosts());
      stmnt.setFloat(6, inventory.getCurrentCosts());

      stmnt.setLong(7, inventory.getCategoryId());
      stmnt.setDate(8, Datumformatierung.getDate(inventory.getCreationDate().getAsLong()));
      stmnt.setLong(9, inventory.getOwnerId());

      stmnt.setLong(10, inventory.getLastRedactorId());
      stmnt.setDate(11, Datumformatierung.getDate(inventory.getLastUpdateDate().getAsLong()));
      stmnt.setString(12, inventory.getInfo());

      stmnt.setLong(13, inventory.getId());
      // Update Ausführen
      verarbeitZeilen = stmnt.executeUpdate();

      // Transaktion beenden:
      connect.commit();
      connect.setAutoCommit(true);
    }
    catch (Exception e) {
      e.printStackTrace();
      throw new InventoryDbException();
    }
    finally {
      if (stmnt != null)
        try {
          stmnt.close();
        }
        catch (Exception ex) {
        }
        stmnt = null;
//      dbZentrale.freeConnection();
    }
    return verarbeitZeilen;
  }

}
```

Es geht hier um die SQL-Abfrage in der Methode getAll(DbConnectionZentrale dbZentrale, String categoryid). Wenn ich das gleiche Statement auf der Konsole absetze, klappt die Abfrage 1a. Nur in diesem Programm nicht. Ich bekomme dann immer die Fehlermeldung

java.sql.SQLException: Syntax error or access violation message from server: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'c.CATEGORYID=1' at line 1"

Komisch das es auf der Konsole klappt und nicht im Programm. Weiß jemand Rat und Tat?

Gruß
Padde


----------



## abollm (24. Jan 2006)

Lass dir mal dein SQL-Statement im Programm ausgeben (z.B. per Logging oder selbst einbauen). Was genau wird da ausgegeben?


----------



## Bleiglanz (24. Jan 2006)

```
" WHERE i.CATEGORYID=c.CATEGORYID" +
              "AND c.CATEGORYID=" + categoryid);
```
in der ersten zeile ein blank am ende rein


----------



## padde479 (24. Jan 2006)

Danke mein Freund! Jetzt funktioniert das Programm genauso wie es soll.

Lieben Gruß
Padde


----------

