当前位置: 首页 > 面试题库 >

Java PreparedStatement抱怨execute()上的SQL语法

邬朗
2023-03-14
问题内容

这真让我发疯……我在这里做错了什么?

ArrayList<String> toAdd = new ArrayList<String>();
toAdd.add("password");
try{
    PreparedStatement pStmt = conn.prepareStatement("ALTER TABLE testTable ADD ? varchar(100)");
        for (String s : toAdd) {
            pStmt.setString(1, s);
            pStmt.execute();
        }
} catch (SQLException e) {
    e.printStackTrace();
}

结果是…

02:59:12,885错误[STDERR]
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的“
password” varchar(100)”附近使用

但…

ArrayList<String> toAdd = new ArrayList<String>();
toAdd.add("password");
try{
    Statement stmt = conn.prepareStatement();
        for (String s : toAdd) {
            stmt.execute("ALTER TABLE testTable ADD "+s+" varchar(100)");
        }
} catch (SQLException e) {
    e.printStackTrace();
}

完美运行…直接在MySQL命令行客户端直接输入文本也是如此。

mysql> alter table testTable add stringGoesHere varchar(100);
Query OK, 1 row affected (0.23 sec)
Records: 1  Duplicates: 0  Warnings: 0

我究竟做错了什么?


问题答案:

在MySQL手册明确表示,?(参数标记)是唯一,不列名绑定的数据值。

参数标记只能用于应显示数据值的地方,而不能用于SQL关键字,标识符等。

因此,您将不得不使用第二种方法。



 类似资料:
  • 我一直在尝试以多种不同的方式在windows上构建fltk,但最终我总是得到: 配置:错误:C编译器无法创建可执行文件(msys fltk/配置) 或 检查C编译器是否正常工作:C:/MinGW/bin/gcc.exe--已损坏(CMake-gui) 我用fltk 1.3.0和1.3.3试用过它,我甚至用过三个不同的MinGW发行版,GCC版本:。但它无法编译。以下是由生成的一些错误日志/配置文件

  • 问题内容: 我尝试在Ubuntu 12.04上安装Pycharm,并且得到以下信息: 正常工作该怎么办? 问题答案: 由于Oracle设置的限制,大多数较新的发行版不再包含Oracle(Sun)JDK。相反,它们与OpenSDK一起提供。尽管OpenSDK适用于大多数应用程序,但PyCharm似乎存在一些问题。 您必须手动安装Oracle(Sun)JDK,并确保它是默认JDK或在启动PyCharm

  • 当我尝试启动spring boot应用程序时,我遇到了以下错误。它甚至在我提供作业参数之前就给出了一个错误,该参数是作业的参数。 许多讨论建议使用资源作为来解决这个问题。但对我没用。提前谢了。

  • 问题内容: 我有一个现有项目,该项目使用@Override的方法会覆盖接口方法,而不是超类方法。我无法在代码中更改它,但是我希望Eclpse不再抱怨注释,因为我仍然可以使用Maven进行构建。 我将如何禁用此错误? 注意:由于项目要求,我需要针对Java 1.5进行编译。 问题答案: 在实现接口声明的方法的方法上使用注释仅从Java 6起有效。这是Java 5中的错误。 确保将你的IDE项目设置为

  • 我有这个类来启动SpringCloudConfig服务器。这是一个Spring Boot应用程序。 应用程序运行正常,我的所有单元测试都正常。然而,在我们的竹子管道中,它将初始一个声纳过程来分析代码。我们不断收到这些小警告,表示以下内容: 我知道这是一个小问题,但我的任务是从代码中删除这些内容。 理想情况下,您应该将类标记为final并提供一个私有构造函数,或者所有搜索都提供一个解决方案。但是,S

  • 版本: Datastax Java driver 3.1.4, Cassandra 3.10 请考虑下表: 和一个映射类: 为此类创建映射器后(是mykeyspace上会话的) 在呼叫时 我明白了 查询准备失败:INSERT INTO mykey space . object _ ta(objid,objid,version_date,objecttype)值(?,?,?,?);:com . da