【问题标题】:Database Update & Sortable JTable Issues数据库更新和可排序 JTable 问题
【发布时间】:2014-06-08 09:17:16
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

    标签: java swing sqlite netbeans-7


    【解决方案1】:

    1) 为什么我会收到此错误消息? (我是否错误地执行了准备好的语句?)

    我对 SQL 了解不多,所以我只提几个建议:

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

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

    sorter使用的Comparator其实是基于TableModel的getColumnClass()方法,而不是JTable。

    因此,您需要覆盖 TableModelgetColumnClass(...) 方法。我还将覆盖 TableModel 中的 setValueAt(...) 方法,以将所有覆盖保留在一个类中。

    编辑:

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

    String sql = "UPDATE Page SET Title = ? WHERE Name = ?";
    
    PreparedStatement stmt = connection.prepareStatement(sql);
    
    stmt.setString( 1, "update" );
    stmt.setString( 2, "Name3" );
    stmt.executeUpdate();
    stmt.close();
    

    同样,首先尝试使用硬编码值。

    【讨论】:

    • 这解释了排序问题,谢谢!关于空捕获,它仅用于 StackOverflow 的目的,我在其中有一些识别变量用于我不想公开发布的错误处理(基于公司名称的类名)。清理自定义 JTable 并为标准 JTable 制作自定义 TableModel 的好主意。
    • camickr 来救援,关于准备好的语句的列名,您是绝对正确的。对其进行硬编码并且有效,请随时编辑您的答案以反映未来的访问者。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多