# Java DB Embedded DB



## kreye (6. Apr 2009)

HAllo, ich will eine Java Programm mit einer Embedded Db machen. 
Die Datenbank kann ich erstellen, aber leider kann ich dann keine Talellen erzeugen. bzw. denke ich das er die Tabellen erzeugt, ich aber einen Fehler beim hinzufügren von informationen machen. ich hänge hier mal meinen code ran. vllt kann mir jemand meinen Fehler sagen. Die exception komm´t immer da wo ich was hinzufügen will.


hier mein code, weiß leider gerade nicht wie ich hier ein codeblock einfüge 

[HIGHLIGHT="Java"]package database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author kreye
 */
public class Verbindung {

    //private Connection dbConnection = null;
    private Statement stmt;
    Connection dbConnection;
    private String sql = "CREATE TABLE app.nutzer(ID INT NOT NULL, Name VARCHAR(32))";

    public Verbindung() throws ClassNotFoundException, SQLException {


        String userHomeDir = System.getProperty("user.home", ".");
        String systemDir = userHomeDir + "/.addressbook";

        // Set the db system directory.
        System.setProperty("derby.system.home", systemDir);
        Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

        String strUrl = "jdbc:derbyefaultAddressBook;";

        try {
            dbConnection = DriverManager.getConnection(strUrl);
            statement();
            System.out.println("gab es schon");
        } catch (SQLException ex) {
            //ex.printStackTrace();
            String strUrl3 = "jdbc:derbyefaultAddressBook;create=true";
            dbConnection = DriverManager.getConnection(strUrl3);
            initialDb();

            System.out.println("existierte nicht");
        }

 String strUrl2 = "jdbc:derbyefaultAddressBook;user=dbuser;password=dbuserpwd";
        try {
            dbConnection = DriverManager.getConnection(strUrl2);
            System.out.println("Bin Drin");
            statement();

        } catch (SQLException sqle) {
            sqle.printStackTrace();

        }

    }

    /**
     * @return the tmt
     */
    public Statement getSTmt() {
        return stmt;
    }

    private void initialDb() throws SQLException {
        String kreye = "Kreye";
        stmt.execute(sql);

        stmt.executeUpdate("INSERT INTO app.nutzer (ID, Name)values(1,\""+kreye+"\")" );
        //ResultSet datenbank = stmt.executeQuery("Select * from dbuser.nutzer");
        System.out.println("Datenbank erzeugt");
        //System.out.println("" + datenbank.getString("Name"));
    }

    private void statement() throws SQLException {
        stmt = dbConnection.createStatement();
    }
}[/HIGHLIGHT]

Hier die Exception

[HIGHLIGHT="Java"]
Exception in thread "main" java.sql.SQLSyntaxErrorException: Die Spalte 'Kreye' ist in keiner Tabelle der FROM-Liste enthalten, erscheint in einer Verknüpfungsspezifikation und befindet sich außerhalb des Geltungsbereichs derselben oder erscheint in einer HAVING-Klausel und ist nicht in der 'GROUP BY'-Liste enthalten. Wenn es sich um eine Anweisung CREATE oder ALTER TABLE handelt, ist 'Kreye' keine Spalte in der Zieltabelle.
        at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
        at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedStatement.executeUpdate(Unknown Source)
        at database.Verbindung.initialDb(Verbindung.java:76)
        at database.Verbindung.<init>(Verbindung.java:45)
        at learning.Main.main(Main.java:22)
Caused by: java.sql.SQLException: Die Spalte 'Kreye' ist in keiner Tabelle der FROM-Liste enthalten, erscheint in einer Verknüpfungsspezifikation und befindet sich außerhalb des Geltungsbereichs derselben oder erscheint in einer HAVING-Klausel und ist nicht in der 'GROUP BY'-Liste enthalten. Wenn es sich um eine Anweisung CREATE oder ALTER TABLE handelt, ist 'Kreye' keine Spalte in der Zieltabelle.
        at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
        ... 11 more
Caused by: ERROR 42X04: Die Spalte 'Kreye' ist in keiner Tabelle der FROM-Liste enthalten, erscheint in einer Verknüpfungsspezifikation und befindet sich außerhalb des Geltungsbereichs derselben oder erscheint in einer HAVING-Klausel und ist nicht in der 'GROUP BY'-Liste enthalten. Wenn es sich um eine Anweisung CREATE oder ALTER TABLE handelt, ist 'Kreye' keine Spalte in der Zieltabelle.
        at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
        at org.apache.derby.impl.sql.compile.ColumnReference.bindExpression(Unknown Source)
        at org.apache.derby.impl.sql.compile.ResultColumn.bindExpression(Unknown Source)
        at org.apache.derby.impl.sql.compile.ResultColumnList.bindExpressions(Unknown Source)
        at org.apache.derby.impl.sql.compile.RowResultSetNode.bindExpressions(Unknown Source)
        at org.apache.derby.impl.sql.compile.DMLStatementNode.bindExpressions(Unknown Source)
        at org.apache.derby.impl.sql.compile.InsertNode.bindStatement(Unknown Source)
        at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
        at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
        at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source)
        ... 5 more
Java Result: 1
[/HIGHLIGHT]
thx kreye


----------



## Ebenius (6. Apr 2009)

[off topic] Quelltext bitte in Zukunft mit [noparse][Highlight=Java]Quelltext[/Highlight][/noparse] formatieren. Der Standard- und der WYSIWYG-Editor haben dafür auch einen Knopf (der mit der Java-Tasse).

Ebenius


----------



## maki (6. Apr 2009)

>> vllt kann mir jemand meinen Fehler sagen. Die exception komm´t immer da wo ich was hinzufügen will.

Dein Fehler ist dass du uns die Exception nicht verrätst, oder sollte das ein Quiz werden?


----------



## kreye (6. Apr 2009)

So habe die Exception nochmal hinzugefügt.


----------



## tfa (6. Apr 2009)

Strings werden mit ' maskiert, nicht mit ".
Gewöhn dir besser gleich Prepared Statements an, dann passiert sowas nicht.


----------



## maki (6. Apr 2009)

Teste mal:

```
stmt.executeUpdate("INSERT INTO app.nutzer (ID, Name) values (1, 'Kreye')" );
```
Was passiert?

Überigens solltest du PreparedStatemetns verwenden, dass erspart dir maskieren von Apostrophen/Hochkommata und alle anderen möglichen Konvertiuerungen und vermeidet so viele Fehlerquellen, nebenbei ist dann auch keine sog. "SQL Injection" mehr möglich.

Nachtrag: tfa war mal wieder schneller...


----------



## tfa (6. Apr 2009)

2 Minuten... ;-)


----------



## maki (6. Apr 2009)

Und das obwohl ich nichtmal mehr auf die Rechtschreibung achte.. ich werde wohl alt *g*


----------



## kreye (6. Apr 2009)

Vielen Dank, das mit dem ' war der Fehler, super Forum.


----------

