Java:SQLite参数填充PreparedStatement会导致错误

Java:SQLite参数填充PreparedStatement会导致错误,java,sql,sqlite,sqlitejdbc,Java,Sql,Sqlite,Sqlitejdbc,我试图使用从Java读取SQL数据库中的数据,但在将参数填充到PreparedStatement时,我得到了一个错误。下面是代码的重要部分和错误 Scanner scanner = new Scanner(System.in); Connection db = DriverManager.getConnection("jdbc:sqlite:kurssit.db"); Statement s = db.createStateme

我试图使用从Java读取SQL数据库中的数据,但在将参数填充到
PreparedStatement
时,我得到了一个错误。下面是代码的重要部分和错误

        Scanner scanner = new Scanner(System.in);
        Connection db = DriverManager.getConnection("jdbc:sqlite:kurssit.db");
        Statement s = db.createStatement();
        PreparedStatement p;
                        p = db.prepareStatement("SELECT SUM(K.laajuus) "
                                + "FROM Suoritukset S, Kurssit K "
                                + "WHERE S.kurssi_id = K.id AND S.paivays LIKE '" + "?" + "%';");
                        p.setString(1, scanner.nextLine());
                        try {
                            ResultSet r = p.executeQuery();
                            System.out.println("Amount: " + r.getString(1));
                        } catch (SQLException e) {
                            System.out.println("Data not found.");
                        }
第28行,即错误的那一行,在代码的这个缩短版本中,它说
p.setString(1,scanner.nextLine())


非常感谢。

您需要这样使用列名:

System.out.println(“金额:+r.getString(“列名称”)

System.out.println(“金额:+r.getNString(1))


第一个允许您访问给定
字符串
名称的列,而第二个允许您使用
int
编号访问表列。

sql语句构造不正确。
占位符不能在单引号内,因为如果它在单引号内,则不会将其视为占位符,而只是一个字符串。
它将被
setString()之后的字符串正确替换
更改为:

p = db.prepareStatement(
  "SELECT SUM(K.laajuus) FROM Suoritukset S, Kurssit K WHERE S.kurssi_id = K.id AND S.paivays LIKE ? || '%';"
);
作为旁注,您应该使用正确的连接语法:

p = db.prepareStatement(
  "SELECT SUM(K.laajuus) FROM Suoritukset S INNER JOIN Kurssit K ON S.kurssi_id = K.id WHERE S.paivays LIKE ? || '%';"
);
p = db.prepareStatement(
  "SELECT SUM(K.laajuus) FROM Suoritukset S, Kurssit K WHERE S.kurssi_id = K.id AND S.paivays LIKE ? || '%';"
);
p = db.prepareStatement(
  "SELECT SUM(K.laajuus) FROM Suoritukset S INNER JOIN Kurssit K ON S.kurssi_id = K.id WHERE S.paivays LIKE ? || '%';"
);