sqlite 从sql请求中的计数获取整数值

yc0p9oo0  于 2023-01-02  发布在  SQLite
关注(0)|答案(3)|浏览(182)

我有一个SQL Lite数据库,包含我需要计数的特定值。我只需要一次,与某个值有关。如果我在数据库中写入以下请求:

SELECT count(Global_Sales) FROM Data WHERE Platform =='PC';

我得到了我需要的,但是如果我在函数中使用相同的请求,所有的请求都保存在一个txt文件中,它会说:

no such column: 'count'

我使用的代码:

try(Connection conn = DriverManager.getConnection(url))
        {

            Path pathRQ = Paths.get("resources/BaseRequests.txt");
            requests = Files.readAllLines(pathRQ, StandardCharsets.UTF_8);
            Statement stm = conn.createStatement();

            for(int i =0; i < requests.size();i++)
            {
                Value.add(stm.executeQuery(requests.get(i)).getInt("count"));
            }
        }
        catch(SQLException ex )
        {
             System.out.println(ex.getMessage());
        }
        catch(IOException ex )
        {
             System.out.println(ex.getMessage());
        }

我尝试将“count”更改为“Global_Sales”-相同的消息显示,只是文本稍有不同。我不知道为什么会发生这种情况,可能是因为数据库中的所有值都保存为“TEXT”,也可能是因为我在这里的代码中做了一些错误。问题是-如何修复此问题?

3gtaxfhh

3gtaxfhh1#

你能试试吗?

Value.add(stm.executeQuery(requests.get(i)).getInt(1));

据我所知,由于一次只返回一个值(1行,1列),您应该能够使用上面的代码片段

f1tvaqid

f1tvaqid2#

使用列的别名:

SELECT count(Global_Sales) as colname FROM Data WHERE Platform ='P'

然后你可以用它来得到这个值

Value.add(stm.executeQuery(requests.get(i)).getInt("colname"));

顺便说一句:SQL中的相等检查将由一个相等符号而不是两个来完成。

qyuhtwio

qyuhtwio3#

count不是列的名称。列的名称为count(Global_Sales)
正如其他人所说,你可以添加一个column alias,但是你不需要列名。接口java.sql.Statement中的方法executeQuery返回一个ResultSet。首先,你需要调用方法next,然后你可以调用方法getInt(int)并使用列索引而不是列名。

try (Connection conn = DriverManager.getConnection(url)) {
    Path pathRQ = Paths.get("resources/BaseRequests.txt");
    requests = Files.readAllLines(pathRQ, StandardCharsets.UTF_8);
    for (int i = 0; i < requests.size(); i++) {
        try (Statement stm = conn.createStatement();
             ResultSet rs = stm.executeQuery(requests.get(i))) {
            if (rs.next()) {
                Value.add(rs.getInt(1));
            }
        }
    }
}
catch(IOException | SQLException ex) {
    ex.printStackTrace();
}

我不能测试上面的代码,因为我没有你的SQLite数据库的副本,我也不能模拟一个,因为你问题中的代码不是minimal, reproducible example,但我认为为每个[SQL]查询创建一个新的、单独的Statement可能更好。
还建议在代码引发异常时打印整个堆栈跟踪,而不是仅打印错误消息。请注意,某些异常没有消息,因此对于此类异常,仅打印消息与完全忽略异常是一样的。

相关问题