首页 > 解决方案 > 尽管查询在 SQLiteStudio 中正确生成结果,但 ResultSet 返回空

问题描述

语境:

使用sqlite3制作的本地数据库,称为lims.db,其中包含一个名为privLevels的表,其中列user存储用户名,级别存储从 0 到 2 的整数,但作为字符串。

privLevels
~~~~~~~~~~~~~~
user  | level
~~~~~~~~~~~~~~
admin | 0
john  | 1
kevin | 2
susan | 1

我正在尝试在此表上运行SQL SELECT查询,然后将结果传递给 Map 对象,其中来自用户的值是键,来自级别的值是值。

    privMap
~~~~~~~~~~~~~~~
<"admin" = "0">
<"john" = "1">
<"kevin" = "2">
<"susan" = "1">

我遇到的问题是生成的ResultSet被返回为完全空的。下面代码中的 while 循环永远不会运行,并且在 IntelliJ 调试器中,ResultSet对象是空的。在SQLiteStudio中,查询运行正确。在我的其余代码中,语句运行良好,但查询却不行。

代码:

getPrivMapFromDatabase() 应该可以工作 - 如果ResultSet包含任何内容。它从用户和级别获取值,然后将它们 .puts() 放入地图中。

 public void getPrivMapFromDatabase() {
     ResultSet results = Base.getStringMapFromDatabase("privLevels", "user", "level");
     try {
         while(results.next()) {
           String user = results.getString("user");
           System.out.println(user);
           String level = results.getString("level");
           System.out.println(level);
           privMap.put(user, level);
         }
     }
     catch (SQLException e) {
         System.out.println("[EXCEPTION] " + e.getMessage());
         e.printStackTrace();
     }
 }

这些方法在“Base”类中。

我这样写getStringMapFromDatabase()因为我需要对另一个表和地图做同样的事情。它应该生成字符串(我检查过它在语法上是正确的)然后执行它。

executeQuery()应该只运行查询,然后将ResultSet 返回getPrivMapFromDatabase()。但是,ResultSet对象是空的。CREATE / INSERT 语句工作正常(使用单独的方法运行语句)。

 private static String url = "jdbc:sqlite:C:/Users/#My_Username#/IdeaProjects/#Project_Name#/sqlite/db/lims.db";

 //Username and project name redacted

 public static ResultSet getStringMapFromDatabase(String table, String keyColumn, String valueColumn) {
     String sql = "SELECT " + keyColumn + ", " + valueColumn + " FROM " + table + ";";
     return executeQuery(sql);
 }

 public static ResultSet executeQuery(String sql) {
     ResultSet results = null;
     try (Connection connection = DriverManager.getConnection(url);
          Statement statement = connection.createStatement()) {
         results = statement.executeQuery(sql);
     }
     catch (SQLException exception) {
         System.out.println("[EXCEPTION] " + exception.getMessage());
     }
     return results;
 }

即使查询在 SQLiteStudio 中运行良好且其他语句正常工作,为什么 ResultSet 仍为空?表名和列名正确。

标签: javasqlsqlite

解决方案


推荐阅读