PreparedStatements

nero110

Mitglied
Nabend zusammen,

nachdem ich mein Problem bereits - leider etwas unstrukturiert und undeutlich - geschildert habe, versuche ich es ein zweites Mal besser darzustellen.

Ich habe ein Problem mit PreparedStatements. Und zwar erhalte ich, bei folgendem Code, die Exception ("java.sql.SQLException: 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 '?' at line 1").

Der Code, der eine neue Datenbank mit Namen des übergebenen Strings erstellen soll, lautet wie folgt:

Code:
 	  Class.forName("com.mysql.jdbc.Driver").newInstance();
 
 	  Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/", "root", "test");
 
 	  PreparedStatement preparedStatement = connection.prepareStatement("CREATE DATABASE ?");
 	  preparedStatement.setString(1, string_databaseName);
 
 	  preparedStatement.executeUpdate();
 
 	  preparedStatement.close();
 
 	  connection.close();

Ich wäre für Vorschläge sehr dankbar.

Vielen Dank,

Chris
 
PreparedStatements sind für SQL-Anfragen, die häufig ausgeführt werden und deshalb vorkompiliert (=vom Optimizer des DBMS verarbeitet und deshalb effizient beim Aufruf) vorliegen sollten. CREATE DATABASE scheint mir eher nicht zu dieser Kategorie zu gehören (was generell für alle Arten von DDL-Statements gilt) ...

Code:
    Statement stmt = connection.createStatement();
    stmt.execute("CREATE DATABASE " + string_databaseName);

btw: string_databaseName ist 'ne ausgesproch häßliche Namenskonvention :)
 
Zuletzt bearbeitet:
executeUpdate()

Executes the SQL statement in this PreparedStatement object, which must be an SQL INSERT, UPDATE or DELETE statement; or an SQL statement that returns nothing, such as a DDL statement.
 
Das man laut API auch in PreparedStatements DDL verwenden kann, ist mir durchaus bewußt. Es macht aber einfach keinen Sinn, außer Du kannst mir erklären, warum ich ein CREATE DATABASE möglichst effizient mehrmals hintereinander (mit mehrmals meine ich nicht zwei- oder dreimal) ausführen wollen sollte?

EDIT: Vielleicht ist das hier der Grund: http://www.codefutures.com/weblog/andygrove/archives/2005/02/mysql_and_prepa.html
 
Zuletzt bearbeitet:
"DDL verwenden kann, ist mir durchaus bewußt. Es macht aber einfach keinen Sinn, außer Du kannst mir erklären, warum ich ein CREATE DATABASE möglichst effizient mehrmals hintereinander"

Ich schreibe ein Programm zur Datenbankverwaltung, da ist es durchaus denkbar, dass ein CREATE DATABASE oefters hintereinander ausgefuehrt wird.
Außerdem kann Sinn und Art der Anwendung ja nicht der Grund sein, weshalb es nicht funktioniert...
 
Hallo!

IMHO funktioniert die Parameterersetzung bei preparedStatements nur bei DML Anweisungen korrekt.

Das ist aber kein Problem denn ein Workaound dauert nicht mal 3 min...
Code:
 * created on 24.02.2005@09:54:50
 */
package de.tutorials;

import java.sql.Connection;
import java.sql.Statement;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

/**
 * @author Administrator
 * 
 */
public class MysqlCreateTableTest {
    private final static String SQL = new String("CREATE TABLE ? (?)");

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver").newInstance();

        MysqlDataSource ds = new MysqlDataSource();
        ds.setServerName("localhost");
        ds.setDatabaseName("test");
        ds.setPort(3306);
        ds.setUser("root");
        ds.setPassword("");

        Connection con = (Connection) ds.getConnection();

        Statement stmt = con.createStatement();

        stmt.execute(createTable("Foo", "id int, name varchar(32)"));

        stmt.close();
        con.close();

    }

    private static String createTable(String tablename,
            String columnsDescription) {
        StringBuffer sb = new StringBuffer(SQL);

        final int IDX_TABLENAME = sb.indexOf("?");
        sb.replace(IDX_TABLENAME, IDX_TABLENAME + 1, tablename);
        final int IDX_COLUMNS_DESCRIPTION = sb.indexOf("?", IDX_TABLENAME + 1);
        sb.replace(IDX_COLUMNS_DESCRIPTION, IDX_COLUMNS_DESCRIPTION + 1,
                columnsDescription);

        return sb.toString();
    }
}

Wenn die Tabelle schon existiert, dann bekommt man eine :
Code:
Exception in thread "main" java.sql.SQLException: Table 'foo' already exists
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2851)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1534)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1625)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:2291)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:2226)
	at com.mysql.jdbc.Statement.execute(Statement.java:883)
	at de.tutorials.MysqlCreateTableTest.main(MysqlCreateTableTest.java:35)

HTH,
Gruß Tom
 
Zurück