【发布时间】:2017-11-16 17:06:46
【问题描述】:
StackOverFlow 的朋友!
我尝试在 select 语句中“返回”一个 ResultSet 并有错误... 我在 Google 和 StackOverFlow 中搜索,但没有解决这个问题!
语句插入工作正常!但是选择不起作用...
数据库层:
package Database;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class DBConnection {
private static Connection conn = null;
private static ResultSet rs = null;
private static Statement stmt = null;
private static PreparedStatement pst = null;
private static final String DATABASE_PATH_NAME="jdbc:sqlite:MiraReal.Xitano";
private Connection Connect()
{
try
{
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection(DATABASE_PATH_NAME);
return conn;
}
catch (Exception ex)
{
Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
public boolean RunQuery(String sql)
{
Statement stmt;
try {
Connect();
stmt = conn.createStatement();
stmt.execute(sql);
Disconnect();
return true;
} catch (SQLException ex) {
Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
// create a new table
}
public ResultSet RunSelect(String sql){
try {
Connect();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
//rs..moveToFirst();
Disconnect();
} catch (SQLException ex) {
Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, ex);
}
return rs;
}
public int RunCount(String sql, String where)
{
return 1;
}
private void Disconnect()
{
try
{
DBConnection.conn.close();
DBConnection.conn = null;
} catch (SQLException ex) {
Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
动作层:
package Actions;
import Models.CustomersModels;
import java.sql.ResultSet;
import java.util.logging.Logger;
public class CustomersActions extends CustomersModels {
protected String sqlInsert = "INSERT INTO customers (uuid, fullname, email, created_at, updated_at) VALUES ('%s', '%s', '%s', '%s', '%s') ";
protected String sqlUpdate = "UPDATE customers SET fullname='%s' WHERE uuid='%s'";
protected String sqlDelete = "DELETE FROM customers WHERE uuid='%s'";
protected String sqlSelect = "SELECT %s FROM customers %s %s %s";
public boolean insert()
{
String sql = String.format(sqlInsert, this.getUuid(),
this.getFullname(), this.getEmail(), this.getCreatedAt(),
this.getUpdatedAt());
return this.RunQuery(sql);
}
public boolean update()
{
String sql = String.format(sqlUpdate, this.getFullname(), this.getUuid());
return this.RunQuery(sql);
}
public boolean delete()
{
String sql = String.format(sqlDelete, this.getUuid());
return this.RunQuery(sql);
}
public ResultSet select(String columns, String where, String order, String limit)
{
String sql = String.format(sqlSelect, columns, where, order, limit);
System.out.println(sql);
return this.RunSelect(sql);
}
}
尝试使用它(使用 net.proteanit.sql.DbUtils 将结果集设置为 jTable):
Customers customers = new Customers();
String customersColumns = "*";
String customersWhere = "";
String customersOrder = "";
String customersLimit = "";
ResultSet dsCustomers = customers.select(customersColumns, customersWhere, customersOrder, customersLimit);
this.jTable1.setModel(DbUtils.resultSetToTableModel(dsCustomers));
错误:
run:
SELECT * FROM customers
java.sql.SQLException: The prepared statement has been finalized
at org.sqlite.core.NativeDB.throwex(NativeDB.java:471)
at org.sqlite.core.NativeDB.column_name_utf8(Native Method)
at org.sqlite.core.NativeDB.column_name(NativeDB.java:232)
at org.sqlite.jdbc3.JDBC3ResultSet.getColumnName(JDBC3ResultSet.java:721)
at org.sqlite.jdbc3.JDBC3ResultSet.getColumnLabel(JDBC3ResultSet.java:714)
at net.proteanit.sql.DbUtils.resultSetToTableModel(DbUtils.java:21)
at Frames.MiraReal.seederCustomers(MiraReal.java:142)
at Frames.MiraReal.<init>(MiraReal.java:37)
at Frames.MiraReal$2.run(MiraReal.java:177)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Frames.MiraReal.seederCustomers(MiraReal.java:142)
at Frames.MiraReal.<init>(MiraReal.java:37)
at Frames.MiraReal$2.run(MiraReal.java:177)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)
我在做什么?
谢谢!
【问题讨论】:
-
这不是您编写 PreparedStatement 的方式。我不知道“%s”是干什么用的。使用 PreparedStatement 时,您使用“?”设置参数。然后使用 setXXX(...) 语句为这些参数提供值。
I Search in Google and StackOverFlow- 好吧,您需要再次搜索,因为有很多示例显示了使用 PreparedStatement 的正确方法。只需使用“PreparedStatement”作为搜索关键字,我相信您会找到示例。 -
我在 Actions 层中使用 %s... 这在 PreparedStatement 中没有使用!我将它交付到数据库层(RunSelect)!是否可以在没有 PreparedStatement 的情况下进行选择查询?
-
PreparedStatment 可以更轻松地创建 SQL 语句,从而通过使用不正确的分隔符等减少语法错误。
-
你为什么不回答这个问题?如果您不知道或不想帮助,您不必浪费时间打扰!谢谢你,朋友!
-
我看到了一条错误消息
prepared statement has been finalized。我以前从未见过那条消息,所以我不知道它到底是什么。但是,当我查看您的代码时,我注意到您没有正确使用PreparedStatement,因此第一个建议显然是修复该语句,看看是否有帮助。这是作为评论提出的,而不是让您思考的答案。太糟糕了,你不欣赏人们所做的努力。