从java中的选定表行加载数据

时间:2013-11-06 20:52:07

标签: java swing jtable odbc

我正在尝试使用鼠标事件来显示其他文本字段中jtable的选定行但是当我运行它并点击任何行时它会出现此消息java.sql.Exception [microsoft] [odbc microsoft access drive ]标准例外中的数据类型不匹配

请任何想法都可以帮助

这是代码:

private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {                                     

    try
    {
        int row = jTable1.getSelectedRow();
        String Table_Click = (jTable1.getModel().getValueAt(row,0).toString());
        String Sql= "SELECT * FROM tblUsers WHERE ID='" + Table_Click +"' ";
        pst = con.prepareStatement(Sql);
        rs = pst.executeQuery();

        if(rs.next())
        {
            String Add1= rs.getString("ID");
            jTextField_ID.setText(Add1);
            String AddBrNa= rs.getString("UserName");
            jTextField_UN.setText(AddBrNa);
            String AddBrAdd= rs.getString("Password");
            jPasswordField_Pass.setText(AddBrAdd);
            String AddBrYear= rs.getString("FName");
            jTextField_FN.setText(AddBrYear);
            String AddBrCourse= rs.getString("LName");
            jTextField_LN.setText(AddBrCourse);
            String AddBrSec= rs.getString("DateCreated");
            jTextField_date.setText(AddBrSec);
           JOptionPane.showMessageDialog(null, "errorif");
        }
        else
        {
             JOptionPane.showMessageDialog(null, "error");
        }
    }
    catch(Exception e)
    {
        JOptionPane.showMessageDialog(null, e);
    }
} 

4 个答案:

答案 0 :(得分:3)

java.sql.Exception [microsoft ][odbc microsoft access drive] data type mismatch in criteria exception:与你的桌子无关。检查您的SQL查询。很可能您的ID是整数类型,但您在where子句中将其检查为字符串:

WHERE ID='" + Table_Click +"'

答案 1 :(得分:3)

尝试使用PreparedStatement来简化SQL。如果你确实需要按照Sage的建议使用int,那么你可以这样做:

String sql = "SELECT * FROM tblUsers WHERE ID = ?";
PreparedStatement pst = con.prepareStatement(sql);
pst.setInt(1, ...)

答案 2 :(得分:3)

  

我正在尝试使用鼠标事件来显示jtable中的选定行   在其他文本字段

没有必要使用MouseListener来做到这一点。只需实现一个ListSelectionListener即使通过键盘或代码进行选择更改也会执行:

jTable1.getSelectionModel().addListSelectionListener(new ListSelectionListener() {            
    @Override
    public void valueChanged(ListSelectionEvent e) {
        // Your code here
    }
};

如果您仍想使用MouseListener,我建议您进行此更改:

//int row = jTable1.getSelectedRow();
int row = jTable1.rowAtPoint(evt.getPoint());

因为在触发此事件之前,您无法确定行选择是否会更改。我不确定,但我会说MouseEvent优先于ListSelectionEvent

但请注意,此row索引属于view,而不属于模型,因此如果您的表是已排序的,则以下行可能不会返回预期结果:

String Table_Click = (jTable1.getModel().getValueAt(row,0).toString()); 

应该是:

String Table_Click = (jTable1.getValueAt(row,0).toString());

话虽如此,PreparedStatemen的正确使用是@camickr刚刚指出的:

String sql = "SELECT * FROM tblUsers WHERE ID = ?";
PreparedStatement pst = con.prepareStatement(sql); //
pst.setString(1, Table_Click) // assuming the ID is a varchar, since you enclosed it into ''

另请注意,您正在Event Dispatch Thread访问您的数据库。您应该在单独的线程中执行此操作并更新EDT中的Swing组件。在这种情况下,SwingWorker听起来很不错。

答案 3 :(得分:0)

谢谢大家,

这很好用:

String Sql =“SELECT * FROM tblUsers WHERE ID =”+ Table_Click;