【发布时间】:2019-07-15 09:59:43
【问题描述】:
我需要一个返回列默认值的方法,所以我做了这个方法:
public String mostraDefault(String column) {
String def = null; //default value
try {
//query to get the def value (tried on oracle and works)
String sql = "Select DATA_DEFAULT from USER_TAB_COLUMNS where TABLE_NAME ='CLASSDIAGRAM' and COLUMN_NAME = '" + column.toUpperCase() + "'";
conn = Database.nuovaConnessione();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if (rs.next()) {
def = rs.getString(1);
}
} catch (SQLException ex) {
//Logger.getLogger(ClassDiagram.class.getName()).log(Level.SEVERE, null, ex);
}
return def;
}
此方法由以下调用,它允许将记录插入到整个 Java Swing GUI 的表中:
public void insertRecord() {
try {
//query to insert
String sql = "INSERT INTO ClassDiagram(Nome) VALUES(?)";
conn = Database.nuovaConnessione();
ps = conn.prepareStatement(sql);
String nome;
//handle default value
if (txtNome.getText().isEmpty()) {
//nome = "Nuovo progetto";
nome = mostraDefault("nome");
System.out.println(nome); //this correctly prints its def val on stout
} else {
nome = txtNome.getText();
}
ps.setString(1, nome);
ps.executeUpdate();
} catch (SQLException e) {
//this gets thrown
JOptionPane.showMessageDialog(this, e.getMessage(), "Errore SQL: " + e.getErrorCode(),
JOptionPane.ERROR_MESSAGE);
} catch (Exception e) {
JOptionPane.showMessageDialog(this, e.getMessage(), "Errore",
JOptionPane.ERROR_MESSAGE);
}
}
但是这个方法会抛出
错误 SQL 17003:无效的列索引
(抛出 SQLException)
但我无法弄清楚我错过了什么。
编辑:如果我在 mostraDefault 方法的 finally 子句中关闭 rs 和 conn,
错误 SQL 17009:关闭语句 被抛出。
【问题讨论】:
-
您是否有意不关闭
mostraDefault中的rs、ps和conn?看起来 `Database.nuovaConnessione()§ 可能会从两个调用中为您提供 same 连接对象,对吗? -
如果我关闭该资源,则会引发另一个异常:17009 已关闭语句
-
是的,或者使用 try-with 块;否则你会在某个时候泄漏连接。不过,如果两者使用相同的连接,这只是问题的一部分。
-
17009 关闭语句被抛出