【问题标题】:Mistakes with table clicked fetching from DB单击从数据库中获取表的错误
【发布时间】:2014-02-26 18:03:02
【问题描述】:

你能帮帮我吗?我的项目有库存.. 当我检索结果集时,单击表格时它不会出现在字段中。 代码如下..

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());
    }          
  }   
}  

任何帮助表示赞赏。

【问题讨论】:

  • 您的问题我不清楚,您是否收到任何错误消息?是的,然后发布它。
  • 是的,我得到了 { Microsoft [ODBC Microsoft Access Drver] 数据类型不匹配标准表达式
  • 1) 将catch (Exception e) { .. 形式的代码更改为catch (Exception e) { e.printStackTrace(); // very informative! .. 2) 为了尽快获得更好的帮助,请发布Minimal Complete Tested and Readable Example (MCTRE)。
  • 我的整个项目似乎都有同样的问题。任何人都可以看到它gulfup.com/?GVqln1
  • “任何人都可以看到它” 许多人不能或不会关注外部链接。将 MCTRE 发布为 edit to the question

标签: java swing jdbc jtable


【解决方案1】:

注意你的 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();

这里 rowview 中选定的行号,而不是 model,所以你应该请求正确的值。你有两个选择:

向表请求值

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(又名 EDT),导致 GUI 无响应。 EDT 是一个单一且特殊的线程,Swing 组件在其中创建和更新。为避免阻塞此线程,请考虑使用SwingWorker 在后台线程中执行数据库调用并更新 EDT 中的 Swing 组件。在Concurrency in Swing trail 中查看更多信息。

我建议您查看this answer 中公开的提示。总结:

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

最后但同样重要的是,请始终关注Java Code Conventions

【讨论】:

  • 我不确定您是否在这里找到了答案(主要是因为对问题的不确定性),但是 +1 以获得大量出色的建议。
  • @AndrewThompson 谢谢。老实说,第一次更像是猜测,但基于此 OP 的评论:“是的,我得到了 { Microsoft [ODBC Microsoft Access Drver] 数据类型不匹配标准表达式” 我认为问题显然出在 SQL 中声明。
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多