java - 2 参数 PreparedStatement 抛出语法错误,SQL 状态 42601,靠近第二个参数
问题描述
我正在创建一个简单的 java 应用程序,它使用我已经创建的 postgresql 数据库(数据库已经创建,而不是应用程序)。其中一个表称为“员工”。它有一个名为“eid”的属性,是员工 ID 的缩写。
我正在尝试使用 PreparedStatement 来概括数据库 SELECT 查询。我希望有两个通用的参数。我还想得到结果的长度,所以我创建了第二个 PreparedStatement 来找到它。
代码看起来很简单,但我不断收到相同的语法错误。
这是我试图运行的代码:
public static String[] select(Connection conn, String arguments) {
try {
PreparedStatement preparedSelect = conn.prepareStatement("SELECT ? FROM ?");
PreparedStatement preparedCount = conn.prepareStatement("SELECT COUNT(*) FROM ?");
String[] arrOfStr = arguments.split(" ", 0);
System.out.println(arrOfStr[0].equals("eid"));
System.out.println(arrOfStr[1].equals("Employee"));
preparedSelect.setString(1, arrOfStr[0]);
preparedSelect.setString(2, arrOfStr[1]);
preparedCount.setString(1, arrOfStr[1]);
ResultSet rsSelect = preparedSelect.executeQuery();
ResultSet rsCount = preparedCount.executeQuery();
...
在第一行的参数中,我希望 SELECT 查询为:“SELECT eid FROM Employee”。在第二行的参数中,我希望 SELECT 查询为:“SELECT COUNT(*) FROM Employee”。
使用此应用程序的用户输入(在程序的前面)在“select”函数的参数中找到的“arguments”参数。“arrOfStr”字符串数组将包含这两个字符串,“eid”和“Employee”。
为了检查“arrOfStr”是否具有正确的值,我打印了 .equals() 函数产生的布尔值,将值与我想要的字符串进行比较,这些字符串又是“eid”和“Employee”。
在控制台中,结果出乎我的意料:
true
true
因此,在接下来的 3 行中,我将字符串值“eid”和“Employee”设置到 PreparedStatements 中。
最后,我在以下 2 行中执行查询。这两个查询执行(我尝试过切换它们)都给我一个非常相似的错误。对于给定的代码,我收到错误:
SQL State: 42601
ERROR: syntax error at or near "$2"
Position: 16
这说明字符串“Employee”的语法存在问题。
当我直接进入我的 postgresql 数据库并输入:
SELECT eid FROM Employee;
我得到输出:
1663
1983
1357
...
有人可以解释这个语法错误吗?
解决方案
正如 Elliott 所提到的,您不能以这种方式绑定表名。
为了实现你的目标,试试这个:
String[] arrOfStr = arguments.split(" ", 0);
PreparedStatement preparedSelect = conn.prepareStatement("SELECT ? FROM " + arrOfStr[1]);
PreparedStatement preparedCount = conn.prepareStatement("SELECT COUNT(*) FROM " + arrOfStr[1]);
推荐阅读
- php - MySQL - 从多个列中选择并忽略重复的结果
- python - Scipy不导入线性规划
- java - Oracle Java 教程 - 静态类 - 教程中可能出现的错误
- python - 如何以一种方式对python列表进行排序,如果1应该在之前,10和2在20之前
- python-2.7 - 如何使用随机密钥执行凯撒密码逻辑?
- java - 在 Android Studio 3.1.3 中构建 gradle 失败
- javascript - JS-Data addAction 方法抛出而不是拒绝带有错误消息的承诺
- react-native - 使用远程 MacBook 使用 XCode 构建 React Native 应用程序
- google-chrome-extension - 来自 chrome 扩展的调度事件清除事件数据传输
- python-3.x - 如何将包含 nan 的单元格的值更改为另一个特定值?