1

我正在尝试使用鼠标事件在其他文本字段中显示 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

4 回答 4

3

尝试使用 aPreparedStatement使 SQL 更容易。如果您确实需要按照 Sage 的建议使用 int,那么您可以执行以下操作:

String sql = "SELECT * FROM tblUsers WHERE ID = ?";
PreparedStatement pst = con.prepareStatement(sql);
pst.setInt(1, ...)
于 2013-11-06T21:35:49.287 回答
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());

因为您无法确定在触发此事件之前行选择会发生变化。我不确定,但我会说 aMouseEvent应该优先于 a 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听起来很合适。

于 2013-11-06T21:58:43.840 回答
3

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

WHERE ID='" + Table_Click +"'
于 2013-11-06T21:21:19.800 回答
0

谢谢大家,

这工作正常:

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

于 2013-11-07T18:49:46.657 回答