我编写了一个自定义JTable来在我的Java程序中显示我的SQLite数据库的内容。这是代码:
public class SortableJTable extends JTable{
public SortableJTable()
{
super();
}
public SortableJTable(DefaultTableModel dtm)
{
super(dtm);
}
@Override
public void setValueAt(Object obj, int row, int col)
{
super.setValueAt(obj, row, col);
PRGView.dbc.updateOrdersWithTicketRequestID(this.getColumnName(col).toString(), obj, (Integer)this.getValueAt(row, 0));
}
@Override
public Class getColumnClass(int c)
{
switch (c)
{
case 0:
return Integer.class;
case 1:
return Integer.class;
case 2:
return String.class;
case 3:
return String.class;
case 4:
return Double.class;
case 5:
return Double.class;
default:
return String.class;
}
}
}
正如您所看到的,每当有人编辑自定义JTable中的单元格(调用setValueAt方法时)时,我都希望能够立即修改数据库内容以反映这些更改。
这是在该方法中调用的数据库代码。
public void updateOrdersWithTicketRequestID(String columnName, Object columnValue, Integer ticketRequestID)
{
try
{
String sql = "UPDATE ORDERS SET ? = ? WHERE Ticket_Request_ID = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, columnName);
pstmt.setObject(2, columnValue);
pstmt.setInt(3, ticketRequestID);
pstmt.executeUpdate();
pstmt.close();
}
catch (SQLException e){}
}
一旦我的代码进入此声明:
pstmt = conn.prepareStatement(sql);
在上面的代码中,它返回错误:SQL错误或缺少数据库(接近“?”:语法错误)。
我有两个问题:
1)为什么我收到此错误消息? (我是否错误地准备了预备声明?)
2)我的自定义JTable类中的getColumnClass没有正确排序我的列。它们总是按字符串顺序排序,而不是使用我已经布局的开关盒。我做错了吗?
感谢您的帮助!
答案 0 :(得分:2)
1)为什么我收到此错误消息? (我是否错误地准备了预备声明?)
我对SQL知之甚少,所以我只提出几点建议:
catch (SQLException e){}
- 打印出SQLException。 我的自定义JTable类中的getColumnClass没有正确排序我的列
分拣机使用的比较器实际上是基于TableModel的getColumnClass()方法,而不是JTable。
因此,您需要覆盖getColumnClass(...)
的{{1}}方法。我还会覆盖TableModel中的TableModel
方法,以便将所有覆盖保留在一个类中。
编辑:
您可能无法将列名指定为变量。我过去成功使用过这样的代码:
setValueAt(...)
再次尝试使用硬编码值。