数据库更新&可排序的JTable问题

时间:2014-06-08 00:48:12

标签: java swing sqlite netbeans-7

我编写了一个自定义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没有正确排序我的列。它们总是按字符串顺序排序,而不是使用我已经布局的开关盒。我做错了吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

  

1)为什么我收到此错误消息? (我是否错误地准备了预备声明?)

我对SQL知之甚少,所以我只提出几点建议:

  1. catch (SQLException e){} - 打印出SQLException。
  2. 另外,如果您不确定PreparedStatement是否正确。然后尝试使用SQL字符串中的硬编码值来调用SQL。一旦你获得了硬编码SQL工作,你就可以将它转换为PreparedStatement。
  3.   

    我的自定义JTable类中的getColumnClass没有正确排序我的列

    分拣机使用的比较器实际上是基于TableModel的getColumnClass()方法,而不是JTable。

    因此,您需要覆盖getColumnClass(...)的{​​{1}}方法。我还会覆盖TableModel中的TableModel方法,以便将所有覆盖保留在一个类中。

    编辑:

    您可能无法将列名指定为变量。我过去成功使用过这样的代码:

    setValueAt(...)

    再次尝试使用硬编码值。