Java:SQLite参数填写PreparedStatement报错
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.0\executor-snippets\run.xml:111: The following error occurred while executing this line:
C:\Users\user\AppData\Local\NetBeans\Cache.0\executor-snippets\run.xml:68: Java returned: 1
第 28 行,即错误行,在这个缩短版本的代码中,即 p.setString(1, scanner.nextLine());
。
//Imports
import java.sql.*;
import java.util.*;
非常感谢。
您需要像这样使用列名:
System.out.println("Amount: " + r.getString("COLUMN_NAME"));
或
System.out.println("Amount: " + r.getNString(1));
第一个允许您访问给定 String
名称的列,而第二个允许您使用 int
编号访问 table 列。
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 ? || '%';"
);
我正在尝试使用 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.0\executor-snippets\run.xml:111: The following error occurred while executing this line:
C:\Users\user\AppData\Local\NetBeans\Cache.0\executor-snippets\run.xml:68: Java returned: 1
第 28 行,即错误行,在这个缩短版本的代码中,即 p.setString(1, scanner.nextLine());
。
//Imports
import java.sql.*;
import java.util.*;
非常感谢。
您需要像这样使用列名:
System.out.println("Amount: " + r.getString("COLUMN_NAME"));
或
System.out.println("Amount: " + r.getNString(1));
第一个允许您访问给定 String
名称的列,而第二个允许您使用 int
编号访问 table 列。
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 ? || '%';"
);