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:
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
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:
Code:
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