2015-01-16 74 views
0

首先,我在我的程序中創建了一個搜索函數,並且我在將數據添加到數據庫中時實現了相同的邏輯,但搜索函數起作用,而添加函數沒有(SQLException)。我創建了一個表,從DB2命名爲名稱只有一列全名。你是否還需要創建一個新的查詢來將數據添加到表中?或不?我想通過GUI將數據添加到數據庫中。DB2和Java。通過GUI將數據添加到數據庫。

這是我的Java代碼:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.sql.*; 

public class ConnectAndSearchDB extends JFrame implements ActionListener 
{ 
    private JTextField fieldSearch,fieldAdd; 
    private JButton searchB,addB; 
    private Connection connection; 
    private String name; 
    private ResultSet rs,rs1; 

    public ConnectAndSearchDB() throws SQLException,ClassNotFoundException 
    { 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(this.EXIT_ON_CLOSE); 
     setLayout(new GridLayout(2,2)); 

     fieldSearch = new JTextField(20); 
     searchB = new JButton("Search"); 
     fieldAdd = new JTextField(20); 
     addB = new JButton("Add"); 

     add(searchB); 
     add(fieldSearch); 
     add(addB); 
     add(fieldAdd); 

     searchB.addActionListener(this); 
     addB.addActionListener(this); 

     establishConnection(); 

     pack(); 

     setResizable(false); 
     setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     Object act = e.getSource(); 

     if(act.equals(searchB)) 
     { 
      name = fieldSearch.getText(); 
      searchData(); 
     }else if(act.equals(addB)) 
     { 
      try { 
       addData(); 
      } catch (ClassNotFoundException e1) 
      { 
       e1.printStackTrace(); 
       System.out.println("ClassNotFound"); 
      } catch (SQLException e1) 
      { 
       e1.printStackTrace(); 
       System.out.println("SQLError"); 
      } 
     } 
    } 

    public void establishConnection() throws SQLException , ClassNotFoundException 
    { 
     Class.forName("com.ibm.db2.jcc.DB2Driver"); 
     connection = DriverManager.getConnection("jdbc:db2://localhost:50000/COLINN", "Colinn","ezioauditore");  
    } 


    private void searchData() 
    { 
     try 
     { 
      PreparedStatement s = null; 
      String query; 
      query = "SELECT * from NAMES"; 

      s=connection.prepareStatement(query); 
      rs = s.executeQuery(); 

      boolean matchfound = false; 

      while(rs.next()) 
      { 
       if(rs.getString(1).equals(name)) 
       { 
        matchfound = true; 
        System.out.println("The name "+name+" is found in the Database"); 
        break; 
       } 
      } 

      if(matchfound == false) 
      { 
       System.out.println("Match Not Found"); 
      } 
     } 
     catch(SQLException e) 
     { 
      e.printStackTrace(); 

     } 
    } 

    public void addData() throws ClassNotFoundException,SQLException 
    { 
     PreparedStatement ps = null; 
     String query; 
     query = "INSERT INTO NAMES VALUES('"+fieldAdd.getText()+"')"; 

     ps = connection.prepareStatement(query); 
     rs1 = ps.executeQuery(); 

     System.out.println("Written Successfully"); 
    } 

    public static void main (String args[]) throws SQLException,ClassNotFoundException 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       try 
       { 
        new ConnectAndSearchDB(); 

       } catch (ClassNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (SQLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 

這裏是名稱表:

DB2 Table names Names

+0

*請參閱PreparedStatement#executeUpdate *「和附加功能沒有(的SQLException)。」 - 恭喜你,這是一個'Exception'! 。不重要的是,你應該發佈完整的例外和相關的堆棧軌道 – MadProgrammer

回答

2

不是每說一個答案,而是一系列關於與整體的一些問題擴展評論方法...

第1課 - 資源管理

如果你打開它,你應該關閉它...

String query = "SELECT * from NAMES"; 
try (PreparedStatement stmt = connection.prepareStatement(query)) { 
    try (ResultSet rs = s.executeQuery()) { 
     boolean matchfound = false; 

     while(rs.next()) 
     { 
      if(rs.getString(1).equals(name)) 
      { 
       matchfound = true; 
       System.out.println("The name "+name+" is found in the Database"); 
       break; 
      } 
     } 

    if(matchfound == false) 
    { 
     System.out.println("Match Not Found"); 
    } 
} 
catch(SQLException e) 
{ 
    e.printStackTrace(); 
} 

The try-with-resources Statement瞭解更多詳情...

我還考慮使用單個Connection,而Connection池可能是矯枉過正對於這個問題,你可以簡單地打開和關閉Connection的需要,但要記住,有這樣做的時候發生的開銷......

課#2 - 不要做什麼數據庫可以做的更好

String query = "SELECT count(*) from NAMES where name=?"; 
try (PreparedStatement stmt = connection.prepareStatement(query)) { 
    stmt.setString(1, name); 
    try (ResultSet rs = s.executeQuery()) { 
     boolean matchfound = false; 

     if (rs.next()) 
     { 
      if(rs.getLong(1) > 0) 
      { 
       matchfound = true; 
       System.out.println("The name "+name+" is found in the Database"); 
      } 
     } 

    if(!matchfound) 
    { 
     System.out.println("Match Not Found"); 
    } 
} 
catch(SQLException e) 
{ 
    e.printStackTrace(); 
} 

課#3 - 利用你PreapredStatement的...

而不是...

query = "INSERT INTO NAMES VALUES('"+fieldAdd.getText()+"')"; 

使用...

query = "INSERT INTO NAMES VALUES(?)"; 
//... 
ps.setString(1, fieldAdd.getText()); 

Using Prepared Statements

3

我高度懷疑使用rs1 = ps.executeQuery();來插入/更新該數據庫是你的問題的過程中,你應該使用int count = ps.executeUpdate();

更多細節