0

我正在尝试使用SQLite-JDBC从 Java 中的 SQL 数据库读取数据,但是在向 a 填充参数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.");
                        }
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
    at org.sqlite.core.CorePreparedStatement.batch(CorePreparedStatement.java:121)
    at org.sqlite.jdbc3.JDBC3PreparedStatement.setString(JDBC3PreparedStatement.java:421)
    at Main.main(Main.java:28)
C:\Users\user\AppData\Local\NetBeans\Cache\12.0\executor-snippets\run.xml:111: The following error occurred while executing this line:
C:\Users\user\AppData\Local\NetBeans\Cache\12.0\executor-snippets\run.xml:68: Java returned: 1

第 28 行,即错误所在的行,在这个缩短的代码版本中就是这样说的p.setString(1, scanner.nextLine());

//Imports
import java.sql.*;
import java.util.*;

提前谢谢了。

4

2 回答 2

2

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 ? || '%';"
);
于 2020-10-04T15:54:15.750 回答
-1

您需要像这样使用列名:

System.out.println("Amount: " + r.getString("COLUMN_NAME"));

或者

System.out.println("Amount: " + r.getNString(1));

其中第一个允许您访问给定String名称的列,而第二个允许您使用int数字访问表列。

于 2020-10-04T15:40:04.570 回答