表中的错误点击从DB获取

时间:2014-02-03 09:57:42

标签: java swing jdbc jtable

你可以帮我吗?我的项目中有库存.. 当我检索Resultset时,当我点击表格时它不会出现在字段中.. 代码在下面..

private void table_lectureKeyPressed(java.awt.event.KeyEvent evt) {                                         
  if(evt.getKeyCode()==KeyEvent.VK_DOWN || evt.getKeyCode()==KeyEvent.VK_UP ){

    try {
      int row=table_lecture.getSelectedRow();
      String Table_Clicked=table_lecture.getModel().getValueAt(row, 0).toString();
      String sql="Select * from Lectures where Lecture_ID='"+Table_Clicked+"' ";
      ps=con.prepareStatement(sql);
      rs=ps.executeQuery();    

      if (rs.next()) {
       try {
         String add1=rs.getString("Lecture_ID").toString();
         txt_LectureNO.setText(add1);
         String add2=rs.getString("Lecture_Name");
         txt_lecture.setText(add2);
         String add3=rs.getString("Lecture_Date");
         dtc_Date.setDateFormatString(add3);
         String add4=rs.getString("Lecture_Time");
         txt_Time.setText(add4);
         String add5=rs.getString("Lecturer");
         txt_Lecturer.setText(add5);
         String add6=rs.getString("Lecture_Place");
         txt_Place.setText(add6);
         String add7=rs.getString("Audiance");
         txt_Audiance.setText(add7);
         String add8=rs.getString("Remark");
         txp_Remarks.setText(add8);
       } catch(Exception e) {
          JOptionPane.showMessageDialog(null, e.getMessage());
        }
      }
    } catch(Exception e ){
      JOptionPane.showMessageDialog(null, e.getMessage());
    }          
  }   
}  

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:4)

请注意您的SQL语句:

"Select * from Lectures where Lecture_ID='"+Table_Clicked+"' "

此语句将解析如下:

Select * from Lectures where Lecture_ID = '1'

简而言之,ID是一种数字数据类型,因此我怀疑问题出在您的SQL语句中,为您提供一个空结果集(或导致SQLException)。此外,您的查询容易受到SQL injection攻击。

要避免这些问题,您需要正确使用PreparedStatement

int row = table_lecture.getSelectedRow();
Object tableClicked = table_lecture.getValueAt(row, 0);
String sql = "SELECT * FROM Lectures WHERE Lecture_ID = ?";
ps = con.prepareStatement(sql);
ps.setObject(1, tableClicked);
rs = ps.executeQuery();    

您的代码的一些提示:

int row = table_lecture.getSelectedRow();
String Table_Clicked = table_lecture.getModel().getValueAt(row, 0).toString();

此处row 视图 中选定的行号,而不是 模型 ,因此你应该要求适当的价值。您有两种选择:

对表的请求值

int row = table_lecture.getSelectedRow();
String Table_Clicked = table_lecture.getValueAt(row, 0).toString();

在其各自的模型索引

中转换视图索引
int row = table_lecture.getSelectedRow();
int modelIndex = table_lecture.convertRowIndexToModel(row);
String Table_Clicked = table_lecture.getModel().getValueAt(modelIndex , 0).toString();

当您使用Swing时,最好使用Keybinding而不是KeyListeners,原因是本主题中讨论的原因:Key bindings vs. key listeners in Java

在这种特殊情况下,我不会使用键绑定,而是使用ListSelectionListener代替:

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

数据库调用是一项耗时的任务,可能会阻止Event Dispatch Thread(a.k.a.EDT)导致GUI无响应。 EDT是一个单独的特殊线程,可以在其中创建和更新Swing组件。为避免阻塞此线程,请考虑使用SwingWorker在后台线程中执行数据库调用并更新EDT中的Swing组件。请参阅Concurrency in Swing trail

中的详情

我建议你看看this answer中提到的提示。总结:

  • 在域类中包装数据。
  • 使用SwingWorker在后台线程中执行数据库调用 更新EDT中的Swing组件。

最后但同样重要的是,一直关注Java Code Conventions