【问题标题】:Creating table dynamically by SQL in ServletServlet中SQL动态创建表
【发布时间】:2014-09-25 11:48:18
【问题描述】:

我在这方面遇到了错误:准备好的语句。

准备好的声明:

PreparedStatement pStatement=connection.prepareStatement
("CREATE TABLE `details`.?(`ID` VARCHAR(255) NOT NULL,`Score` VARCHAR(255) NULL);
INSERT INTO `testdetails`.? (`ID`) VALUES (?);");
pStatement.setString(1, "usrname");
pStatement.setString(2, "usrname");
pStatement.setString(3, "001");
pStatement.executeUpdate();

错误详情:

Severe:   com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
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
''usrname'(`ID` VARCHAR(255) NOT NULL,`Score` VARCHAR(255) NULL);INSER' at line 1

如何解决这个错误?

【问题讨论】:

    标签: java mysql jdbc prepared-statement


    【解决方案1】:

    JDBC 参数通常不能用于表名和列名 - 它们仅用于

    不幸的是,我认为这是您需要动态构建 SQL 的情况之一。当然,您会希望非常谨慎选择允许的值。

    【讨论】:

    • 是的,但是如何创建一个新表并动态插入值?
    • @M.S.:正如我所说:动态构建 SQL。如果您手动将表名放入 SQL 中,您是否检查过 SQL 是否正常工作?
    • @M.S.除了 Jon 指出的问题,你不能同时执行 两个 语句。
    【解决方案2】:

    出现此错误是因为您使用了#setString,而字符串被'' 包裹。

    要解决此问题,您可以使用以下 sn-ps 之一:

    "CREATE TABLE `details`.#tableName#(`ID` VARCHAR(255) NOT NULL,`Score` VARCHAR(255) NULL); INTO `testdetails`.#tableName# (`ID`) VALUES (?);".replaceAll("#tableName#", "usrname");
    

    new StringBuilder("CREATE TABLE `details`.").append("usrname").append("(`ID` VARCHAR(255) NOT NULL,`Score` VARCHAR(255) NULL); INTO `testdetails`.").append("usrname").append("(`ID`) VALUES (?);").toString();
    

    并将结果字符串传递给#prepareStatement() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 2013-10-14
      • 2022-10-13
      • 2018-02-02
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多