ResultSet 返回 PreparedStatement 参数而不是实际结果
ResultSet returning PreparedStatement parameter instead of actual results
我想从 MariaDB 数据库中获取数据并通过 Maven 安装了 MariaDB JDBC 连接器。以下代码将 PreparedStatement pstmt
数据的参数而不是实际的 row/cell 数据添加到组合框(参见代码片段,第 10 行)。这是我要解决的问题。如果重要的话,我的 table 由 1 个 int 和 4 个 varchars 组成。
代码片段(含行数):
// WRITTEN IN NORMAL JAVA 11
1| Connection db = DriverManager.getConnection("jdbc:mariadb://localhost:3306/DB", "USER", "PASSWORD");
2| PreparedStatement pstmt = db.prepareStatement("SELECT ? FROM companies;");
3| pstmt.setString(1, ((JComboItem) companySelectFilterCategoryComboBox.getSelectedItem()).getValue()); // getValue() returns "email"; Combo Box is JComboBox<ComboItem>, ComboItem.groovy is below
4| System.out.println(pstmt); // OUTPUT: sql : 'SELECT ? from companies;', parameters : ['email']
5| ResultSet rs = pstmt.executeQuery();
6| ArrayList<ArrayList<String>> list = ResultSetService.resultSetToArrayLists(rs); // This returns an ResultSet as an deep ArrayList (as ArrayList<ArrayList<String>>), see below
7| System.out.println(ResultSetService.toString(rs)); //OUTPUT: [[email], [email]]
// This output is already wrong, should be: [[mail1@localhost], [mail2@localhost]]
// This is the above mentioned problem I want to fix.
8| companySelectOptionsComboBox.removeAllItems();
9| for (ArrayList<String> arr: list) {
10| companySelectOptionsComboBox.addItem(arr.get(0));
11| }
ComboItem class 基本上只是一个具有 2 个字符串、一个键和一个值的对象。键是正在显示的字符串,值在后端使用(参见代码片段,第 3 行):
// WRITTEN IN GROOVY
class JComboItem {
private String key;
private String value;
JComboItem(String key, String value)
{
this.key = key;
this.value = value;
}
@Override
String toString()
{
return key;
}
String getValue()
{
return value;
}
}
这会翻译 ArrayList 中一行的每个单元格,并将它们放入另一个 ArrayList 中,returns 它(行列表)。错误可能出在此处,但这在脚本的另一部分中完美无缺(如果被问到,我会很乐意提供这部分,但不想让它膨胀 post)。唯一的区别是 tables,工作脚本的 table 由 3 个 varchars 组成:
// WRITTEN IN GROOVY
class ResultSetService {
static ArrayList<ArrayList<String>> resultSetToArrayLists(ResultSet rs) throws SQLException {
ArrayList<ArrayList<String>> list = new ArrayList<>()
rs.beforeFirst()
while (rs.next()) {
ArrayList<String> row = new ArrayList<>()
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
row.add(rs.getString(i))
}
list.add(row)
}
return list
}
}
过去 2 天我一直在查找这个问题,但找不到任何相关信息或类似问题。我最好的猜测是 ResultSetService.resultSetToArrayLists()
处的错误或 PreparedStatement
/ResultSet
的错误使用(即使它在脚本的另一点起作用)。或者库中某处的实际错误。
不能使用占位符插入列名。有效查询
是:select 'email' from something
。你必须连接的名字
列到 sql 字符串中。所以要三倍小心恶意用户可以
不要在那里注入 sql (例如使用枚举或其他类型的
允许列表)。
我想从 MariaDB 数据库中获取数据并通过 Maven 安装了 MariaDB JDBC 连接器。以下代码将 PreparedStatement pstmt
数据的参数而不是实际的 row/cell 数据添加到组合框(参见代码片段,第 10 行)。这是我要解决的问题。如果重要的话,我的 table 由 1 个 int 和 4 个 varchars 组成。
代码片段(含行数):
// WRITTEN IN NORMAL JAVA 11
1| Connection db = DriverManager.getConnection("jdbc:mariadb://localhost:3306/DB", "USER", "PASSWORD");
2| PreparedStatement pstmt = db.prepareStatement("SELECT ? FROM companies;");
3| pstmt.setString(1, ((JComboItem) companySelectFilterCategoryComboBox.getSelectedItem()).getValue()); // getValue() returns "email"; Combo Box is JComboBox<ComboItem>, ComboItem.groovy is below
4| System.out.println(pstmt); // OUTPUT: sql : 'SELECT ? from companies;', parameters : ['email']
5| ResultSet rs = pstmt.executeQuery();
6| ArrayList<ArrayList<String>> list = ResultSetService.resultSetToArrayLists(rs); // This returns an ResultSet as an deep ArrayList (as ArrayList<ArrayList<String>>), see below
7| System.out.println(ResultSetService.toString(rs)); //OUTPUT: [[email], [email]]
// This output is already wrong, should be: [[mail1@localhost], [mail2@localhost]]
// This is the above mentioned problem I want to fix.
8| companySelectOptionsComboBox.removeAllItems();
9| for (ArrayList<String> arr: list) {
10| companySelectOptionsComboBox.addItem(arr.get(0));
11| }
ComboItem class 基本上只是一个具有 2 个字符串、一个键和一个值的对象。键是正在显示的字符串,值在后端使用(参见代码片段,第 3 行):
// WRITTEN IN GROOVY
class JComboItem {
private String key;
private String value;
JComboItem(String key, String value)
{
this.key = key;
this.value = value;
}
@Override
String toString()
{
return key;
}
String getValue()
{
return value;
}
}
这会翻译 ArrayList 中一行的每个单元格,并将它们放入另一个 ArrayList 中,returns 它(行列表)。错误可能出在此处,但这在脚本的另一部分中完美无缺(如果被问到,我会很乐意提供这部分,但不想让它膨胀 post)。唯一的区别是 tables,工作脚本的 table 由 3 个 varchars 组成:
// WRITTEN IN GROOVY
class ResultSetService {
static ArrayList<ArrayList<String>> resultSetToArrayLists(ResultSet rs) throws SQLException {
ArrayList<ArrayList<String>> list = new ArrayList<>()
rs.beforeFirst()
while (rs.next()) {
ArrayList<String> row = new ArrayList<>()
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
row.add(rs.getString(i))
}
list.add(row)
}
return list
}
}
过去 2 天我一直在查找这个问题,但找不到任何相关信息或类似问题。我最好的猜测是 ResultSetService.resultSetToArrayLists()
处的错误或 PreparedStatement
/ResultSet
的错误使用(即使它在脚本的另一点起作用)。或者库中某处的实际错误。
不能使用占位符插入列名。有效查询
是:select 'email' from something
。你必须连接的名字
列到 sql 字符串中。所以要三倍小心恶意用户可以
不要在那里注入 sql (例如使用枚举或其他类型的
允许列表)。