尝试编写使用开关从 sqlite 数据库中选择数据的 java 代码

Posted

技术标签:

【中文标题】尝试编写使用开关从 sqlite 数据库中选择数据的 java 代码【英文标题】:Trying to write java code that uses a switch to select data from sqlite database 【发布时间】:2021-01-18 21:17:10 【问题描述】:

我正在尝试使用 JDBC 从数据库中查询数据,但我无法让 SELECT SUM() 在第三个 switch 案例上工作。所有其他情况和第三种情况下的 SELECT 金额都可以正常工作,但是当我尝试使用 SELECT SUM(amount) 时,它会给出错误“没有这样的列:'amount'”。

这是我的代码:

package net.sqlitetutorial;

import java.util.Scanner;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class SQLMain 

    
    private Connection connect() 
        
        String url = "jdbc:sqlite:C://sqlite/db/test.db";
        Connection conn = null;
        try 
            conn = DriverManager.getConnection(url);
         catch (SQLException e) 
            System.out.println(e.getMessage());
        
        return conn;
    

    
    
    

public void selectAll()
        String sql = "SELECT name, amount FROM names ORDER BY amount desc";
        
        try (Connection conn = this.connect();
             Statement stmt  = conn.createStatement();
             ResultSet rs    = stmt.executeQuery(sql))
            
            while (rs.next()) 
                System.out.println(rs.getString("name") +  "\t" + 
                                   rs.getInt("amount"));
                                   
            
         catch (SQLException e) 
            System.out.println(e.getMessage());
        
    

public void selectNames()
        String sql = "SELECT name FROM names ORDER BY name";
        
        try (Connection conn = this.connect();
             Statement stmt  = conn.createStatement();
             ResultSet rs    = stmt.executeQuery(sql))
            
            while (rs.next()) 
                System.out.println(rs.getString("name"));
                                   
            
         catch (SQLException e) 
            System.out.println(e.getMessage());
        
    


public void selectAmount()
        String sql = "SELECT sum(amount) FROM names";
        
        try (Connection conn = this.connect();
             Statement stmt  = conn.createStatement();
             ResultSet rs    = stmt.executeQuery(sql))
            
            while (rs.next()) 
                System.out.println(rs.getInt("amount"));
                                   
            
         catch (SQLException e) 
            System.out.println(e.getMessage());
        
    
    
   
   
    public static void main(String[] args) 
        SQLMain app = new SQLMain();
        
    int number;

      
      Scanner console = new Scanner(System.in);

      
      System.out.println("Choose one by entering a number:\n 1. List all ordered by most popular name first\n 2. List names in alphabetical order");
      number = console.nextInt();

      
      switch (number)
      
    case 1 :
        app.selectAll();
    break;
    

    case 2 :
    app.selectNames();
    break;

    case 3 :
    app.selectAmount();
    break;

    default:
    System.out.println("Invalid input");
    



    


这是它给出的错误: no such column: 'amount'

【问题讨论】:

您能否改进您的帖子以显示更多详细信息,例如代码行和整个错误报告?乍一看我会说你的 test.db 缺少属性amount,但也有可能之前的一些错误会显示连接到数据库本身的问题或其他一些错误...... 【参考方案1】:

在此声明中:

SELECT sum(amount) FROM names

没有返回名称 amount 的列。

您必须为返回的列设置别名:

SELECT sum(amount) AS amount FROM names

或者,如果不对列进行别名,您可以通过其索引 1 获取其值:

System.out.println(rs.getInt(1));

【讨论】:

【参考方案2】:

这是因为结果包含 SUM(amount) 而不是列 amount

例如,您可以通过将查询更改为来解决此问题

"SELECT sum(amount) AS amount FROM names"

或通过索引获取结果

rs.getInt(1);

【讨论】:

【参考方案3】:

您的查询实际上没有amount 列 - 它有sum(amount)。您可以使用别名为forpas' answer suggests,或仅使用索引(请记住 - JDBC 中的列索引是基于 1 的):

while (rs.next()) 
    System.out.println(rs.getInt(1));

【讨论】:

以上是关于尝试编写使用开关从 sqlite 数据库中选择数据的 java 代码的主要内容,如果未能解决你的问题,请参考以下文章

从SQlite引入数据时,微调器选择不起作用

如果表是变量(python),如何从 SQLite 表中选择

使用java在sqlite中选择两个日期之间的行

如何使用 PHP(和 HTML)从 SQLite 中选择、插入、更新和删除数据

Octave:从 sqlite db 文件中读取 BLOB 数据

代号一、SQLite 和 JSON1 扩展