2014-10-18 109 views
-1

我是java新手。我試圖編寫一個搜索代碼,它應該從數據庫(MS Access)中檢索特定的搜索數據並將其顯示在jTable中。但它給了我一個空指針異常。 它的代碼如下:如何使用jTable從數據庫檢索數據

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import javax.swing.JOptionPane; 
import java.util.Vector; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 

public class GuestDetail extends javax.swing.JFrame { 
     PreparedStatement ps; 
     ResultSet rs; 
     Connection conn; 
     Statement stmt; 
     TableModel tm; 
     int sr; 
/** 
* Creates new form GuestDetail 
*/ 
public GuestDetail() { 
    initComponents(); 
    try{ 
    conn = HotelManagement.ConnectDb(); 
    tm=new DefaultTableModel(4, 4); 
    jTable1.setModel(tm); 
    }catch(Exception ex) 
    { 
     JOptionPane.showMessageDialog(null, ex); 
    } 
} 


private void jButton3ActionPerformed(java.awt.event.ActionEvent evt)   {           

    // TODO add your handling code here: 
    try{ 

     System.out.println("Searching Records.."); 
      String fn=jTextField1.getText(); 

     System.out.println("searching name="+fn); 

     stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 

    // String query1="SELECT * FROM GuestDetails WHERE FirstName LIKE'fn%'"; 

     String query="select FirstName,LastName,City,ContactNo from GuestDetails where FirstName= ' "+jTextField1.getText()+" '"; 

     System.out.println("query:"+query); 
       rs.next(); 
       int rows=rs.getInt(1); 
       ResultSet rs= stmt.executeQuery(query); 
       Object[][] data=new Object[rows][4]; 
       Object[] headers={"FirstName","LastName","City","ContactNo"}; 

       int i=0; 
       while(rs.next()) 
       { 
       int j=0; 
       data[i][j++]=rs.getString(1); 
       data[i][j++]=rs.getString(2); 
       data[i][j++]=rs.getString(3); 
       data[i++][j]=rs.getLong(4); 
       } 
       DefaultTableModel tm=new DefaultTableModel(data, headers); 
      jTable1.setModel(tm);  






    }catch (Exception ex) { 
     Logger.getLogger(GuestDetail.class.getName()).log(Level.SEVERE, null, ex); 
     ex.printStackTrace(); 

    } 
+1

你可以請張貼異常堆棧跟蹤? – DeepInJava 2014-10-18 14:11:14

+0

_代碼如下給出_你給我們的代碼甚至不會編譯。除此之外,只是說你有一個'NullPointerException'並不是真的有用。我們需要知道在你發佈的代碼中哪一行發生了'NullPointerException'。但是如果你找出發生'NullPointerException'的地方,你也可以修復它。另見[這個問題](http://stackoverflow.com/q/218384/1076463) – Robin 2014-10-18 15:28:50

回答

2

你似乎假設ResultSet的第一行和列是行數。相反,請爲ResultSet中遇到的每行創建一個空的DefaultTableModel並使用addRow()方法。

1

從EDT無法進入數據庫。我假設,因爲所有這些活動都在事件處理程序中,所以它會作爲點擊按鈕的結果被調用,並且會被EDT調用。

您需要將所有數據檢索和「data」數組的構造放入Swingworker可運行的表中,然後將數據模型的創建和安裝放入Swingworker的「完成」方法中。

相關問題