JDBC Ungültiger Spaltenindex

Optiplex9020

Mitglied
Hallo ich arbeite momentan an einer Aufgabe in JDBC und habe Probleme mit einem ungültigen Spaltenindex. Komme auch echt nicht mehr weiter und bitte um Hilfe!
Java:
 public void transferSample(Integer sampleId, Integer diameterInCM) {
    L.info("Start");
    PreparedStatement ps = null;
    ResultSet rs = null;
    String sql = "SELECT diameterInCM FROM Tray WHERE diameterInCM = ?";
    L.info(sql + "" + diameterInCM);
    try {
        ps = getConnection().prepareStatement(sql);
        ps.setInt(1, diameterInCM);
        rs = ps.executeQuery();
        if(!rs.next()){
            throw new CoolingSystemException("Durchmesser " + diameterInCM + " nicht vorhanden.");
        }
        ps.close();
        rs.close();
    sql = "SELECT TrayID FROM Tray WHERE diameterInCM = ? ";
    L.info(sql + "-> TrayID = " + trayId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1, trayId);
    rs = ps.executeQuery();
    ArrayList<Integer> list = new ArrayList<Integer>();
    while(rs.next()) {
        list.add(rs.getInt("trayId"));
    }
    ps.close();
    rs.close();
    sql = "SELECT TrayID FROM Place";
    L.info(sql + "-> TrayID = " + trayId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1, trayId);
    rs = ps.executeQuery();
   // ArrayList<Integer> list2 = new ArrayList<Integer>();
   // while(rs.next()) {
   //     list.add(rs.getInt("trayId"));
   // }
    ps.close();
    rs.close();
    sql = "INSERT INTO Place VALUES (?,?,?) WHERE diameterInCM=?";
    L.info(sql + "-> SampleId " + sampleId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1,  trayId);
    ps.setInt(1,  placeNo);
    ps.setInt(1,  sampleId);
    ps.executeUpdate();
    rs = ps.executeQuery();
    ps.close();
    rs.close();
    sql = "INSERT INTO Tray VALUES (?,?,?,?) WHERE diameterInCM=?";
    L.info(sql + "-> SampleId " + sampleId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1,  trayId);
    ps.setInt(1,  diameterInCM);
    ps.setInt(1,  capacity);
    ps.setDate(1,  expirationDate);
    ps.executeUpdate();
    rs = ps.executeQuery();
    int lgN = 0;
    while(lgN < list.size()) {
        list.get(lgN);
        sql = "INSERT INTO Tray VALUES (?,?,?,?) WHERE MIN(ExpirationDate)";
        L.info(sql + "-> TrayId= " + trayId);
        ps = getConnection().prepareStatement(sql);
        ps.setInt(1,  trayId);
        ps.setInt(1,  diameterInCM);
        ps.setInt(1,  capacity);
        ps.setDate(1,  expirationDate);
        ps.executeUpdate();
        rs = ps.executeQuery();
        lgN++;
    }
    ps.close();
    rs.close();
    } catch (SQLException e) {
        throw new CoolingSystemException(e);
    }

Die Methode soll folgende Funktion haben :
Java:
 /**
       * Sucht ein Tablett, das die Probe aufnehmen kann und erzeugt einen
       * entsprechenden Datensatz in der Tabelle Place. Folgende Bedingungen muessen
       * erfuellt sein:
       * <ul>
       * <li>Der Durchmesser muss passen.</li>
       * <li>Die Probe soll auf das Tablett mit dem kleinsten Ablaufdatum kommen,
       * das groesser als das Ablaufdatum der Probe ist.</li>
       * <li>Auf dem ausgewaehlten Tablett soll die Probe auf den kleinsten freien
       * Platz kommen. Da stellt sicher, dass Luecken gefuellt werden.</li>
       * <li>Gibt es kein passendes Tablett, so wird ein leeres Tablett mit
       * passendem Durchmesser genommen und dessen Ablaufdatum auf das Ablaufdatum
       * der Probe plus 30 Tage gesetzt.</li>
       * <li>Gibt es kein leeres Tablett mit passendem Durchmesser mehr, so wird
       * eine Ausnahme ausgeloest.</li>
       * </ul>
       *
       * @param sampleId
       *          Primaerschluessel der Probe.
       * @param diameterInCM
       *          Durchmesser des Probenroehrchens. Wird durch einen Sensor
       *          gemessen.
       * @throws CoolingSystemException
       *           falls kein passendes Tablett gefunden werden kann.
       * @throws DataException
       *           bei allen Datenbankfehlern.
       */
 

Joose

Top Contributor
.... und habe Probleme mit einem ungültigen Spaltenindex.

Ich nehme mal an du bekommst eine Exception geworfen, wenn ja diese inkl StackTrace immer mitposten!

Java:
    sql = "SELECT TrayID FROM Tray WHERE diameterInCM = ? ";
    L.info(sql + "-> TrayID = " + trayId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1, trayId);
    rs = ps.executeQuery();
    ArrayList<Integer> list = new ArrayList<Integer>();
    while(rs.next()) {
        list.add(rs.getInt("trayId"));
    }
Was willst du hier als Parameter setzen bzw auslesen?

Java:
    sql = "SELECT TrayID FROM Place";
    L.info(sql + "-> TrayID = " + trayId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1, trayId);
    rs = ps.executeQuery();
Du hast hier ein Statement ohne Parameter und setzt aber trotzdem einen, warum?

Java:
    sql = "INSERT INTO Place VALUES (?,?,?) WHERE diameterInCM=?";
    L.info(sql + "-> SampleId " + sampleId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1,  trayId);
    ps.setInt(1,  placeNo);
    ps.setInt(1,  sampleId);
    ps.executeUpdate();
    rs = ps.executeQuery();
    ps.close();
    rs.close();
    sql = "INSERT INTO Tray VALUES (?,?,?,?) WHERE diameterInCM=?";
    L.info(sql + "-> SampleId " + sampleId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1,  trayId);
    ps.setInt(1,  diameterInCM);
    ps.setInt(1,  capacity);
    ps.setDate(1,  expirationDate);
    ps.executeUpdate();
    rs = ps.executeQuery();
    int lgN = 0;
    while(lgN < list.size()) {
        list.get(lgN);
        sql = "INSERT INTO Tray VALUES (?,?,?,?) WHERE MIN(ExpirationDate)";
        L.info(sql + "-> TrayId= " + trayId);
        ps = getConnection().prepareStatement(sql);
        ps.setInt(1,  trayId);
        ps.setInt(1,  diameterInCM);
        ps.setInt(1,  capacity);
        ps.setDate(1,  expirationDate);
        ps.executeUpdate();
        rs = ps.executeQuery();
        lgN++;
    }
    ps.close();
    rs.close();
    } catch (SQLException e) {
        throw new CoolingSystemException(e);
    }

Du hast hier mehrere Statements mit mehreren Parametern. Du setzt aber immer nur den ersten Parameter, du solltest den 2. und 3. und n. auch setzen ;)
 

Optiplex9020

Mitglied
Ich nehme mal an du bekommst eine Exception geworfen, wenn ja diese inkl StackTrace immer mitposten!
Ja das stimmt.
Code:
exceptions.CoolingSystemException: java.sql.SQLException: Ungültiger Spaltenindex
    at service.CoolingService.transferSample(CoolingService.java:143)
    at test.CoolingServiceJavaTest.testCoolingService05(CoolingServiceJavaTest.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.sql.SQLException: Ungültiger Spaltenindex
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:445)
    at oracle.jdbc.driver.OraclePreparedStatement.setIntInternal(OraclePreparedStatement.java:4605)
    at oracle.jdbc.driver.OraclePreparedStatement.setInt(OraclePreparedStatement.java:4594)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setInt(OraclePreparedStatementWrapper.java:198)
    at service.CoolingService.transferSample(CoolingService.java:99)
    ... 26 more
Was willst du hier als Parameter setzen bzw auslesen?
Ich habe gehofft die TrayID des Tablets mit dem korrekten Durchmesser dadurch aufnehmen zu können ist das richtig ?

Du hast hier ein Statement ohne Parameter und setzt aber trotzdem einen, warum?
Was genau meinst du mit Statement ohne Parameter ?
Das keine WHERE Klausel dabei ist ?
 

Joose

Top Contributor
Un in welcher Zeile genau tritt diese Exception auf?

Ich habe gehofft die TrayID des Tablets mit dem korrekten Durchmesser dadurch aufnehmen zu können ist das richtig ?
Java:
sql = "SELECT TrayID FROM Tray WHERE diameterInCM = ? ";
ps = getConnection().prepareStatement(sql);
ps.setInt(1, trayId);
rs = ps.executeQuery();
ArrayList<Integer> list = new ArrayList<Integer>();
while(rs.next()) {
   list.add(rs.getInt("trayId"));
}
Dein Statement liest die TrayId der Einträge aus, welche den Entsprechenden "diameterInCM" haben.
Als Parameter setzt du aber nicht "diameterInCM" sondern "trayId" ... meiner Meinung nach falsch. ;)

Was genau meinst du mit Statement ohne Parameter ?
Das keine WHERE Klausel dabei ist ?
Dein SQL Statement hat keine Platzhalter (also keine '?') somit ist es unnötigt für diese Statement irgendwelche Parameter setzen zu wollen.
 

Optiplex9020

Mitglied
Java:
 public void transferSample(Integer sampleId, Integer diameterInCM) {
    L.info("Start");
    PreparedStatement ps = null;
    ResultSet rs = null;
    String sql = "SELECT diameterInCM FROM Tray WHERE diameterInCM = ?";
    L.info(sql + "" + diameterInCM);
    try {
        ps = getConnection().prepareStatement(sql);
        ps.setInt(1, diameterInCM);
        rs = ps.executeQuery();
        if(!rs.next()){
            throw new CoolingSystemException("Durchmesser " + diameterInCM + " nicht vorhanden.");
        }
        ps.close();
        rs.close();
    sql = "SELECT TrayID FROM Tray WHERE diameterInCM = ? ";
    L.info(sql + "-> TrayID = " + trayId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1, trayId);
    rs = ps.executeQuery();
    ArrayList<Integer> list = new ArrayList<Integer>();
    while(rs.next()) {
        list.add(rs.getInt("diameterInCM"));
    }
    ps.close();
    rs.close();
    sql = "SELECT TrayID FROM Place WHERE TrayID = ?";
    L.info(sql + "-> TrayID = " + trayId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1, trayId);
    rs = ps.executeQuery();
   // ArrayList<Integer> list2 = new ArrayList<Integer>();
   // while(rs.next()) {
   //     list.add(rs.getInt("trayId"));
   // }
    ps.close();
    rs.close();
    sql = "INSERT INTO Place VALUES (?,?,?) WHERE diameterInCM=?";
    L.info(sql + "-> SampleId " + sampleId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1,  trayId);
    ps.setInt(2,  placeNo);
    ps.setInt(3,  sampleId);
    ps.executeUpdate();
    rs = ps.executeQuery();
    ps.close();
    rs.close();
    sql = "INSERT INTO Tray VALUES (?,?,?,?) WHERE diameterInCM=?";
    L.info(sql + "-> SampleId " + sampleId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1,  trayId);
    ps.setInt(2,  diameterInCM);
    ps.setInt(3,  capacity);
    ps.setDate(4,  expirationDate);
    ps.executeUpdate();
    rs = ps.executeQuery();
    int lgN = 0;
    while(lgN < list.size()) {
        list.get(lgN);
        sql = "INSERT INTO Tray VALUES (?,?,?,?) WHERE MAX(ExpirationDate)";
        L.info(sql + "-> TrayId= " + trayId);
        ps = getConnection().prepareStatement(sql);
        ps.setInt(1,  trayId);
        ps.setInt(2,  diameterInCM);
        ps.setInt(3,  capacity);
        ps.setDate(4,  expirationDate);
        ps.executeUpdate();
        rs = ps.executeQuery();
        lgN++;
    }
    ps.close();
    rs.close();
    } catch (SQLException e) {
        throw new CoolingSystemException(e);
    }

Wie sehe ich in welcher Zeile eine Exception ausgeworfen wird ?

Ich habe deine Anweisungen befolgt und habe jetzt den Fehler: Fehlender IN und OUT Parameter im Index::4

Code:
de.htwberlin.exceptions.CoolingSystemException: java.sql.SQLException: Fehlender IN- oder OUT-Parameter auf Index:: 4
    at service.CoolingService.transferSample(CoolingService.java:143)
    at test.CoolingServiceJavaTest.testCoolingService05(CoolingServiceJavaTest.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.sql.SQLException: Fehlender IN- oder OUT-Parameter auf Index:: 4
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
    at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:1738)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3382)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3468)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)
    at de.htwberlin.(CoolingService.java:113)
    ... 26 more
 

stg

Top Contributor
Z.B. hier:
Java:
    sql = "INSERT INTO Place VALUES (?,?,?) WHERE diameterInCM=?";
    L.info(sql + "-> SampleId " + sampleId);
    ps = getConnection().prepareStatement(sql);
    ps.setInt(1,  trayId);
    ps.setInt(2,  placeNo);
    ps.setInt(3,  sampleId);
    ps.executeUpdate();
Du hast 4 Platzhalter, aber setzt nur 3 Werte...
 

stg

Top Contributor
Wie sehe ich in welcher Zeile eine Exception ausgeworfen wird ?

Die Zeilennummer kannst du dem Stacktrace entnehmen:
Code:
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
     ...
    at de.htwberlin.(CoolingService.java:113)

Zeile 113 in CoolingService.java ist also verdächtig.
 

JStein52

Top Contributor
int lgN = 0;
while(lgN < list.size()) {
list.get(lgN);
sql = "INSERT INTO Tray VALUES (?,?,?,?) WHERE MAX(ExpirationDate)";
L.info(sql + "-> TrayId= " + trayId);
ps = getConnection().prepareStatement(sql);
ps.setInt(1, trayId);
ps.setInt(2, diameterInCM);
ps.setInt(3, capacity);
ps.setDate(4, expirationDate);
ps.executeUpdate();
rs = ps.executeQuery();
lgN++;
}
Was möchtest du denn da machen ? Erstens ist das WHERE hier falsch. Zweitens machst du ja immer wieder das gleiche. Und drittens falls du da mal was sinnvolles machst sollte das prepare vor der Schleife stattfinden.
 

Optiplex9020

Mitglied
Habe jetzt nochmal am Code gearbeitet aber jetzt das Problem mit einem Fehlerhaften SQL Statement
Java:
package de.htwberlin.service;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.htwberlin.exceptions.CoolingSystemException;
import de.htwberlin.exceptions.DataException;

public class CoolingService2 implements ICoolingService {
  private static final Logger L = LoggerFactory.getLogger(CoolingService.class);
  private Connection connection;
  private int trayId;
  private int capacity;
  private Date expirationDate;
  private int placeNo;

  @Override
  public void setConnection(Connection connection) {
    this.connection = connection;
  }

  private Connection getConnection() {
    if (connection == null) {
      throw new DataException("Connection not set");
    }
    return connection;
  }
     
  public void korrekterDurchmesser(Integer diameterInCM) {
      PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT diameterInCM FROM Tray WHERE diameterInCM = ?";
        L.info(sql + "" + diameterInCM);
        try {
            ps = getConnection().prepareStatement(sql);
            ps.setInt(1, diameterInCM);
            rs = ps.executeQuery();
            if(!rs.next()){
                throw new CoolingSystemException("Durchmesser " + diameterInCM + " nicht vorhanden.");
            }
            ps.close();
            rs.close();
        } catch (SQLException e) {
            throw new CoolingSystemException(e);
        }
  }
 
  public void TabletfürProbefinden(Integer trayId, Integer diameterInCM) {
      PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT TrayID FROM Tray WHERE diameterInCM = ? ";
        try {
            L.info(sql + "-> TrayID = " + trayId);
            ps = getConnection().prepareStatement(sql);
            ps.setInt(1, trayId);
            rs = ps.executeQuery();
            ArrayList<Integer> list = new ArrayList<Integer>();
            while(rs.next()) {
                list.add(rs.getInt("trayId"));
            }
            ps.close();
            rs.close();
        } catch (SQLException e) {
            throw new CoolingSystemException(e);
        }
}
 
  public void TabletaufPlacefinden(Integer trayId) {
      L.info("Start");
      PreparedStatement ps = null;
      ResultSet rs = null;
      String sql = "SELECT TrayID FROM Tray WHERE diameterInCM = ? ";
      try{
        L.info(sql + "-> TrayID = " + trayId);
        ps = getConnection().prepareStatement(sql);
        ps.setInt(1, trayId);
        rs = ps.executeQuery();
        ArrayList<Integer> list = new ArrayList<Integer>();
        while(rs.next()) {
            list.add(rs.getInt("trayId"));
        }
        ps.close();
        rs.close();
      } catch (SQLException e) {
            throw new CoolingSystemException(e);
        }
  }
 
  public void DatensatzaufPlaceeintragen(Integer sampleId) {
      L.info("Start");
      PreparedStatement ps = null;
      ResultSet rs = null;
      String sql = "INSERT INTO Place VALUES (?,?,?) WHERE diameterInCM=?";
      try {
        L.info(sql + "-> SampleId " + sampleId);
        ps = getConnection().prepareStatement(sql);
        ps.setInt(1,  trayId);
        ps.setInt(1,  placeNo);
        ps.setInt(1,  sampleId);
        ps.executeUpdate();
        rs = ps.executeQuery();
        ps.close();
        rs.close();
  } catch (SQLException e) {
      throw new CoolingSystemException(e);
      }
  }
 
  public void ExpirationDatePruefen(Integer sampleId, Integer diameterInCM) {
      L.info("Start");
      PreparedStatement ps = null;
      ResultSet rs = null;
      String sql = "INSERT INTO Tray VALUES (?,?,?,?) WHERE diameterInCM=?";
      try {
        L.info(sql + "-> SampleId " + sampleId);
        ps = getConnection().prepareStatement(sql);
        ps.setInt(1,  trayId);
        ps.setInt(1,  diameterInCM);
        ps.setInt(1,  capacity);
        ps.setDate(1,  expirationDate);
        ps.executeUpdate();
        rs = ps.executeQuery();
        int lgN = 0;
        ArrayList<Integer> list = new ArrayList<Integer>();
        while(lgN < list.size()) {
            list.get(lgN);
            sql = "INSERT INTO Tray VALUES (?,?,?,?) WHERE MIN(ExpirationDate)";
            L.info(sql + "-> TrayId= " + trayId);
            ps = getConnection().prepareStatement(sql);
            ps.setInt(1,  trayId);
            ps.setInt(1,  diameterInCM);
            ps.setInt(1,  capacity);
            ps.setDate(1,  expirationDate);
            ps.executeUpdate();
            rs = ps.executeQuery();
            lgN++;
        }
        } catch (SQLException e) {
      throw new CoolingSystemException(e);
      }
  }

@Override
public void transferSample(Integer sampleId, Integer diameterInCM) {
    korrekterDurchmesser(diameterInCM);
    TabletfürProbefinden(trayId, diameterInCM);
    TabletaufPlacefinden(trayId);
    DatensatzaufPlaceeintragen(sampleId);
    ExpirationDatePruefen(sampleId, diameterInCM);
}
 
      /**
       * Sucht ein Tablett, das die Probe aufnehmen kann und erzeugt einen
       * entsprechenden Datensatz in der Tabelle Place. Folgende Bedingungen muessen
       * erfuellt sein:
       * <ul>
       * <li>Der Durchmesser muss passen.</li>
       * <li>Die Probe soll auf das Tablett mit dem kleinsten Ablaufdatum kommen,
       * das groesser als das Ablaufdatum der Probe ist.</li>
       * <li>Auf dem ausgewaehlten Tablett soll die Probe auf den kleinsten freien
       * Platz kommen. Da stellt sicher, dass Luecken gefuellt werden.</li>
       * <li>Gibt es kein passendes Tablett, so wird ein leeres Tablett mit
       * passendem Durchmesser genommen und dessen Ablaufdatum auf das Ablaufdatum
       * der Probe plus 30 Tage gesetzt.</li>
       * <li>Gibt es kein leeres Tablett mit passendem Durchmesser mehr, so wird
       * eine Ausnahme ausgeloest.</li>
       * </ul>
       *
       * @param sampleId
       *          Primaerschluessel der Probe.
       * @param diameterInCM
       *          Durchmesser des Probenroehrchens. Wird durch einen Sensor
       *          gemessen.
       * @throws CoolingSystemException
       *           falls kein passendes Tablett gefunden werden kann.
       * @throws DataException
       *           bei allen Datenbankfehlern.
       */
  }

Erstens ist das WHERE hier falsch. Zweitens machst du ja immer wieder das gleiche.
Was genau ist an der WHERE Klausel falsch ? Inwiefern meinst du, dass ich immer das gleiche mache ?
 

Joose

Top Contributor
Habe jetzt nochmal am Code gearbeitet aber jetzt das Problem mit einem Fehlerhaften SQL Statement
Schön dass du uns den Code zeigst, die Exception die fliegt und die Zeile wo die Exception auftritt solltest du uns auch noch mitteilen (sonst können wir nur rumraten).

Was genau ist an der WHERE Klausel falsch ? Inwiefern meinst du, dass ich immer das gleiche mache ?
Weil bei einem INSERT INTO Statement eine WHERE Klausel keinen Sinn macht!
http://stackoverflow.com/questions/485039/mysql-insert-where-query
 

stg

Top Contributor
die Exception die fliegt und die Zeile wo die Exception auftritt solltest du uns auch noch mitteilen (sonst können wir nur rumraten)

...und darauf wurde auch schon mehrfach hingewiesen.

Weil bei einem INSERT INTO Statement eine WHERE Klausel keinen Sinn macht!

Außerdem ist WHERE MAX(ExpirationDate) unsinnig, da MAX(ExpirationDate) kein bool'scher Ausdruck ist, sondern die MAX-Funktion einfach nur einen Wert zurückgibt.
Du sagst also etwa so etwas wie "Füge x,y,z ein, wo 3"
 

Optiplex9020

Mitglied
Lässt sich der Failure Trace aktualisieren ?
Ich kann jegliche Änderungen im Code vorgeben und bekomme immer den selben Text.
Java:
exceptions.CoolingSystemException: java.sql.SQLSyntaxErrorException: ORA-00933: SQL-Befehl wurde nicht korrekt beendet

    at service.CoolingService.transferSample(CoolingService.java:144)
    at test.CoolingServiceJavaTest.testCoolingService05(CoolingServiceJavaTest.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.sql.SQLSyntaxErrorException: ORA-00933: SQL-Befehl wurde nicht korrekt beendet

    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:91)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1034)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:953)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1222)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3387)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3468)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)
    at
service.CoolingService.transferSample(CoolingService.java:114)
    ... 26 more

Das irgendetwas im Code falsch ist, ist mir bewusst. Ich bitte um Hilfe, vielleicht einen Verbesserungsvorschlag.

Habe den Code auch nochmal verändert, hat sich jedoch nicht getan.

Java:
public class CoolingService2 implements ICoolingService {
  private static final Logger L = LoggerFactory.getLogger(CoolingService.class);
  private Connection connection;
  private int trayId;
  private int capacity;
  private Date expirationDate;
  private int placeNo;

  @Override
  public void setConnection(Connection connection) {
    this.connection = connection;
  }

  private Connection getConnection() {
    if (connection == null) {
      throw new DataException("Connection not set");
    }
    return connection;
  }
     
  public void korrekterDurchmesser(Integer diameterInCM) {
      PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT diameterInCM FROM Tray WHERE diameterInCM = ?";
        L.info(sql + "" + diameterInCM);
        try {
            ps = getConnection().prepareStatement(sql);
            ps.setInt(1, diameterInCM);
            rs = ps.executeQuery();
            if(!rs.next()){
                throw new CoolingSystemException("Durchmesser " + diameterInCM + " nicht vorhanden.");
            }
            ps.close();
            rs.close();
        } catch (SQLException e) {
            throw new CoolingSystemException(e);
        }
  }
 
  public void TabletfürProbefinden(Integer trayId, Integer diameterInCM) {
      PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT TrayID FROM Tray WHERE diameterInCM = ?";
        try {
            L.info(sql + "-> TrayID = " + trayId);
            ps = getConnection().prepareStatement(sql);
            ps.setInt(1, trayId);
            rs = ps.executeQuery();
            ArrayList<Integer> list = new ArrayList<Integer>();
            while(rs.next()) {
                list.add(rs.getInt("trayId"));
            }
            ps.close();
            rs.close();
        } catch (SQLException e) {
            throw new CoolingSystemException(e);
        }
}
 
  public void TabletaufPlacefinden(Integer trayId) {
      L.info("Start");
      PreparedStatement ps = null;
      ResultSet rs = null;
      String sql = "SELECT TrayID FROM Tray WHERE diameterInCM = ?";
      try{
        L.info(sql + "-> TrayID = " + trayId);
        ps = getConnection().prepareStatement(sql);
        ps.setInt(1, trayId);
        rs = ps.executeQuery();
        ArrayList<Integer> list = new ArrayList<Integer>();
        while(rs.next()) {
            list.add(rs.getInt("trayId"));
        }
        ps.close();
        rs.close();
      } catch (SQLException e) {
            throw new CoolingSystemException(e);
        }
  }
 
 
  public void DatensatzaufPlaceeintragen(Integer sampleId) {
      L.info("Start");
      PreparedStatement ps = null;
      ResultSet rs = null;
      String sql = "INSERT INTO Place VALUES (?,?,?)";
      try {
        L.info(sql + "-> SampleId " + sampleId);
        ps = getConnection().prepareStatement(sql);
        ps.setInt(1,  trayId);
        ps.setInt(1,  placeNo);
        ps.setInt(1,  sampleId);
        ps.executeUpdate();
        rs = ps.executeQuery();
        ps.close();
        rs.close();
  } catch (SQLException e) {
      throw new CoolingSystemException(e);
      }
  }
 
  public void ExpirationDatePruefen(Integer trayId, Integer diameterInCM) {
      L.info("Start");
      PreparedStatement ps = null;
      ResultSet rs = null;
      String sql = "INSERT INTO Tray VALUES (?,?,?,?)";
      try {
        L.info(sql + "-> SampleId " + trayId);
        ps = getConnection().prepareStatement(sql);
        ps.setInt(1,  trayId);
        ps.setInt(1,  diameterInCM);
        ps.setInt(1,  capacity);
        ps.setDate(1,  expirationDate);
        ps.executeUpdate();
        rs = ps.executeQuery();
        int lgN = 0;
        ArrayList<Integer> list = new ArrayList<Integer>();
        while(lgN < list.size()) {
            list.get(lgN);
            sql = "INSERT INTO Tray VALUES (?,?,?,?)";
            L.info(sql + "-> TrayId= " + trayId);
            ps = getConnection().prepareStatement(sql);
            ps.setInt(1,  trayId);
            ps.setInt(1,  diameterInCM);
            ps.setInt(1,  capacity);
            ps.setDate(1,  expirationDate);
            ps.executeUpdate();
            rs = ps.executeQuery();
            lgN++;
        }
        } catch (SQLException e) {
      throw new CoolingSystemException(e);
      }
  }

@Override
public void transferSample(Integer sampleId, Integer diameterInCM) {
    korrekterDurchmesser(diameterInCM);
    TabletfürProbefinden(trayId, diameterInCM);
    TabletaufPlacefinden(trayId);
    DatensatzaufPlaceeintragen(sampleId);
    ExpirationDatePruefen(sampleId, diameterInCM);
}
 
      /**
       * Sucht ein Tablett, das die Probe aufnehmen kann und erzeugt einen
       * entsprechenden Datensatz in der Tabelle Place. Folgende Bedingungen muessen
       * erfuellt sein:
       * <ul>
       * <li>Der Durchmesser muss passen.</li>
       * <li>Die Probe soll auf das Tablett mit dem kleinsten Ablaufdatum kommen,
       * das groesser als das Ablaufdatum der Probe ist.</li>
       * <li>Auf dem ausgewaehlten Tablett soll die Probe auf den kleinsten freien
       * Platz kommen. Da stellt sicher, dass Luecken gefuellt werden.</li>
       * <li>Gibt es kein passendes Tablett, so wird ein leeres Tablett mit
       * passendem Durchmesser genommen und dessen Ablaufdatum auf das Ablaufdatum
       * der Probe plus 30 Tage gesetzt.</li>
       * <li>Gibt es kein leeres Tablett mit passendem Durchmesser mehr, so wird
       * eine Ausnahme ausgeloest.</li>
       * </ul>
       *
       * @param sampleId
       *          Primaerschluessel der Probe.
       * @param diameterInCM
       *          Durchmesser des Probenroehrchens. Wird durch einen Sensor
       *          gemessen.
       * @throws CoolingSystemException
       *           falls kein passendes Tablett gefunden werden kann.
       * @throws DataException
       *           bei allen Datenbankfehlern.
       */
  }
 

stg

Top Contributor
Schau mal hier, alles Zitate aus den letzten Beiträgen:
Ich nehme mal an du bekommst eine Exception geworfen, wenn ja diese inkl StackTrace immer mitposten!
Die Zeilennummer kannst du dem Stacktrace entnehmen:
Habe jetzt eine SQLSyntaxErrorException Das ein SQL Befehl nicht korrekt beendet wurde. Hat jemand eine Ahnung wo ?
Ja, du! Schau in den StackTrace (wie du es eben gelernt hast)
Was genau ist an der WHERE Klausel falsch ? Inwiefern meinst du, dass ich immer das gleiche mache ?
Schön dass du uns den Code zeigst, die Exception die fliegt und die Zeile wo die Exception auftritt solltest du uns auch noch mitteilen (sonst können wir nur rumraten).
Ich kann jegliche Änderungen im Code vorgeben und bekomme immer den selben Text.

...und nun schreibst du schon wieder nur, dass
irgendetwas im Code falsch ist

Da kommt man sich ein wenig verarscht vor. o_O
 

Joose

Top Contributor
Du redest wirr. Was meinst du ?
Wir bitten dich um mehr Informationen um dir helfen zu können.
Du sagst zwar was von einem Fehler/einen Problem aber nicht um welches es sich handelt.

Weiter oben hast du schon mal die Exception inkl StackTrace gepostet. Nichts anderes sollst du jetzt auch machen ;) (aber natürlich mit der aktuellen Exception)
 

Thallius

Top Contributor
Oder einfach mal ein bischen was zum Thema mySQL lesen statt immer nur Code aus dem Internet zu kopieren. Wenn man sich nicht einmal die Basic Commandos und Ihre Syntax selber anließt, dann habe ich ehrlich gesagt auch keinen Bock zu helfen.
 

JStein52

Top Contributor
Hier drin wird es an ein paar Stellen scheppern:
try {
L.info(sql + "-> SampleId " + trayId);
ps = getConnection().prepareStatement(sql);
ps.setInt(1, trayId);
ps.setInt(1, diameterInCM);
ps.setInt(1, capacity);
ps.setDate(1, expirationDate);
ps.executeUpdate();
rs = ps.executeQuery();
int lgN = 0;
ArrayList<Integer> list = new ArrayList<Integer>();
while(lgN < list.size()) {
list.get(lgN);
sql = "INSERT INTO Tray VALUES (?,?,?,?)";
L.info(sql + "-> TrayId= " + trayId);
ps = getConnection().prepareStatement(sql);
ps.setInt(1, trayId);
ps.setInt(1, diameterInCM);
ps.setInt(1, capacity);
ps.setDate(1, expirationDate);
ps.executeUpdate();
rs = ps.executeQuery();
lgN++;
}[/QUOTE

Bei den setInt(...) und setDate(...) musst du jeweils die richtige Spaltennummer angeben und nicht überall 1 !
Ausserdem machst du immer zuerst mal ein executeUpdate() und dann ein executeQuery() .... nur eins davon ist richtig. Und wenn du über die Syntaxfehler in deinen SQL-Statements weg bist können wir mal darüber reden was in der Schleife denn passieren soll.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A JDBC EmbeddedDriver Java Basics - Anfänger-Themen 1
C No suitable driver found for jdbc:odbc:mysql Java Basics - Anfänger-Themen 8
D JDBC wie ermittle ich den Driver? Java Basics - Anfänger-Themen 26
A Java - JDBC SQL Java Basics - Anfänger-Themen 2
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
B MySQL (jdbc) -> connection liefert NULL Java Basics - Anfänger-Themen 3
F Warum erhalte ich diese Fehler bei der Einbindung von SQLite JDBC in Eclipse? Java Basics - Anfänger-Themen 1
Vince42 Java 8 JDBC / OLE DB Java Basics - Anfänger-Themen 15
K JDBC - Wie ist Fehlermeldung zu interpretieren Java Basics - Anfänger-Themen 3
B Java Datenbankverbindungsfähigkeit - JDBC Java Basics - Anfänger-Themen 1
D Was genau ist JDBC? Java Basics - Anfänger-Themen 2
P Classpath jdbc-Treiber kann nach export in jar-File nicht mehr geladen werden Java Basics - Anfänger-Themen 2
M JDBC SQL Problem Java Basics - Anfänger-Themen 5
K org.h2.jdbc.JdbcSQLException: Keine Daten verfügbar Java Basics - Anfänger-Themen 9
J Oracle JDBC Driver funktioniert nur in einer Klasse Java Basics - Anfänger-Themen 2
eLogic JDBC: Relative Pfadangabe in JAR Java Basics - Anfänger-Themen 14
F Erfassung von PCs in eine SQLite-Datenbank über JDBC Java Basics - Anfänger-Themen 9
S JDBC MySQL Connector - Element mit ' eintragen? Java Basics - Anfänger-Themen 4
D JDBC Datenbank fail?! Java Basics - Anfänger-Themen 20
R JDBC leeres ResultSet Problem Java Basics - Anfänger-Themen 2
J Java JDBC MySQL Query Java Basics - Anfänger-Themen 6
X JDBC installieren Java Basics - Anfänger-Themen 2
F JDBC - ClassNotFoundException Java Basics - Anfänger-Themen 3
J jdbc driver on linux ? Java Basics - Anfänger-Themen 11
lenniii DB Basics (JDBC-Treiber) Java Basics - Anfänger-Themen 16
P Servlets und JDBC Java Basics - Anfänger-Themen 2
B JDBC DB2 Connection Java Basics - Anfänger-Themen 1
C OOP JDBC: Ausgabe ResultSet nach Select Java Basics - Anfänger-Themen 3
P JDBC für anfänger Java Basics - Anfänger-Themen 16
D Probleme mit jdbc Java Basics - Anfänger-Themen 9
T JDBC Problemchen Java Basics - Anfänger-Themen 2
B JDBC Treiber lokal installieren ? Java Basics - Anfänger-Themen 2
B JDBC: Bereits in der DB vorhandene Abfrage ausführen Java Basics - Anfänger-Themen 7
G Oracle SQL JDBC in Eclipse laden Java Basics - Anfänger-Themen 2
G Maven Dependency für Oracle JDBC-Driver korrekt festlegen Java Basics - Anfänger-Themen 4
G JDBC - Classpath - Ich werd wahnsinnig! Java Basics - Anfänger-Themen 18
J Fehler bei MySql Anbindung mit JDBC Java Basics - Anfänger-Themen 4
G welche Java-Technologie für JDBC geeignet Java Basics - Anfänger-Themen 6
N JDBC Problem Java Basics - Anfänger-Themen 5
M Datenbankzugriff via JDBC Java Basics - Anfänger-Themen 8
S JDBC und NullpointerException Java Basics - Anfänger-Themen 5
S JDBC Verbindungen Java Basics - Anfänger-Themen 2
M JDBC Treiber LGPL Java Basics - Anfänger-Themen 11
D JDBC Treiber unter dem Java Application Server Java Basics - Anfänger-Themen 6
J java und jdbc mit access Java Basics - Anfänger-Themen 3
J JDBC Crash Kurs Java Basics - Anfänger-Themen 3
D Einige Fragen zu Java Java2D JDBC usw. XD Java Basics - Anfänger-Themen 13
D Kleines Problem mit JDBC Java Basics - Anfänger-Themen 2
T SWT-Tabelle aus JDBC füllen Java Basics - Anfänger-Themen 8
C jdbc Anfänger Tutorial gesucht Java Basics - Anfänger-Themen 19
H JDBC in den Klassenpfad eintragen Java Basics - Anfänger-Themen 4
J jdbc getTableName Java Basics - Anfänger-Themen 12
R JDBC Verbindung geht nicht Java Basics - Anfänger-Themen 4
S Problem mit JDBC und Transaktion Java Basics - Anfänger-Themen 12
G hilfe jsp/servlet,jdbc api running on tomcat server+webProxy Java Basics - Anfänger-Themen 8
K JDBC - Typ Connection in jeder Klasse neu öffnen? Java Basics - Anfänger-Themen 4
A JDBC modular Java Basics - Anfänger-Themen 2
megachucky nochmal JDBC. komme nicht weiter. Java Basics - Anfänger-Themen 4
megachucky JDBC-Grundlagen: Verständnisprobleme Java Basics - Anfänger-Themen 31
S ungültiger Pfad bei der Installation von API documentation Java Basics - Anfänger-Themen 0
S SQL Exception"Ungültiger Spaltenindex" Java Basics - Anfänger-Themen 2
J ORACLE Spatial ungültiger Spaltenindex beim Import Java Basics - Anfänger-Themen 2
M createImage ungültiger Pfad registrieren Java Basics - Anfänger-Themen 2
M Frage zum Abfangen ungültiger Werte Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben