簡體   English   中英

Java:在 PreparedStatement 中填充 SQLite 參數會導致錯誤

[英]Java: SQLite parameter filling in a PreparedStatement results in an error

我正在嘗試使用SQLite-JDBC從 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.");
                        }
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.*;

提前謝謝了。

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 ? || '%';"
);

您需要像這樣使用列名:

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

或者

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

第一個允許您訪問給定String名稱的列,而第二個允許您使用int數字訪問表列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM