2016-05-01 90 views
0

我在將數據插入到使用java創建的postgres表中時遇到了問題。代碼的創建表部分工作正常,只有當我將值插入到表中時纔會發生任何事情。我使用的填充表記錄的代碼是:通過點擊按鈕不會插入數據庫?

//the first class code 
     stmt = c.createStatement();  
    JavaApplication8 dc = new JavaApplication8(); 
      String sql = "INSERT INTO records (start_date,hour,cell_name,Erlang,ErlangU,cell_type,freq_type) VALUES (?,?,?,?,?,?,?)"; 
     PreparedStatement pst = c.prepareStatement(sql); 
      pst.setInt(1, dc.time()); 
      pst.setInt(2,heure); 
      pst.setString(3, "fgf"); 
      pst.setFloat(4, 84/10); 
      pst.setFloat(5,dc.Hourly_Traffic_900); 
      pst.setInt(6, 1); 
      pst.setInt(7, 900); 

     stmt.execute(sql); 
     stmt.close(); 
      c.commit(); 
      c.close(); 
        }} catch (ClassNotFoundException | SQLException e) { 
      System.err.println(e.getClass().getName()+": "+ e.getMessage()); 
      System.exit(0); 
      } 
      System.out.println("Records created successfully");} 

//the jframe code 
     Connection conn = new DBConnection().Connect(); 
     private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
     try { 

      float bsc = Float.parseFloat(jTextField1.getText()); 
      float cellsbsc = Float.parseFloat(jTextField2.getText());   
       float days = Float.parseFloat(jTextField3.getText()); 
     int tot_dense =(int) (bsc*cellsbsc) ; 
      JavaApplication8 dc = new JavaApplication8(); 
      Menu mm = new Menu(); 
        Connection c = null; 
      Statement stmt = null; 

      Class.forName("org.postgresql.Driver"); 
      c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/Records", "postgres", "21262050"); 
      c.setAutoCommit(false); 
      System.out.println("Opened database successfully"); 

     String sql = "INSERT INTO records (start_date,hour,cell_name,Erlang,ErlangU,cell_type,freq_type) VALUES (?,?,?,?,?,?,?)"; 
      PreparedStatement pst = c.prepareStatement(sql); 
       if (mm.jRadioButton1.isSelected()&& mm.jButton1.isSelected()){ 

        for(int i=1; i<tot_dense+1; i++) 
        { 
         for(int d=1; d<days+1; d++) 

         { 
          dc.Day_900(); 

      pst.setInt(1,dc.time()); 
      pst.setInt(2,dc.heure); 
      pst.setString(3, "fgf"); 
      pst.setFloat(4, 84/10); 
      pst.setFloat(5,dc.Hourly_Traffic_900); 
      pst.setInt(6, 1); 
      pst.setInt(7, 900); 

      pst.execute(); 
         } 
        } 
+0

1)使用的縮進代碼的邏輯和一致的形式線和塊。縮進旨在使代碼的流程更易於遵循! 2)爲了更快地獲得更好的幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 –

+0

即使在上面的不可編譯的代碼片段中,該行'JavaApplication8 dc = new JavaApplication8();'也會出現兩次。我懷疑這是問題的根源。爲了交換對合理建議的懷疑,張貼該MCVE。 –

+0

'stmt'和'pst'之間有區別,請嘗試執行'pst.executeUpdate' – MadProgrammer

回答

1

那麼幾件事情,立即站了出來:

  1. 你打電話Connection#setAutoCommit並將其設置爲false,但從來沒有叫Connection#commit
  2. 一般,您應該致電PreparedStatement#executeUpdate而不是execute。它不應該有重大區別,但executeUpdate實際上會返回受調用影響的行數,這可能有助於診斷問題。
  3. 有沒有在你的代碼沒有任何跡象表明,你實際上關閉你的任何資源
  4. 你調用一個循環execute,這往往表明可能使用了批量更新

所以不是,你可以不喜歡......

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

    float bsc = Float.parseFloat(jTextField1.getText()); 
    float cellsbsc = Float.parseFloat(jTextField2.getText()); 
    float days = Float.parseFloat(jTextField3.getText()); 
    int tot_dense = (int) (bsc * cellsbsc); 
    JavaApplication8 dc = new JavaApplication8(); 
    Menu mm = new Menu(); 

    try { 
     Class.forName("org.postgresql.Driver"); 
     try (Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/Records", "postgres", "21262050")) { 
      c.setAutoCommit(false); 
      System.out.println("Opened database successfully"); 

      String sql = "INSERT INTO records (start_date,hour,cell_name,Erlang,ErlangU,cell_type,freq_type) VALUES (?,?,?,?,?,?,?)"; 
      try (PreparedStatement pst = c.prepareStatement(sql)) { 
       if (mm.jRadioButton1.isSelected() && mm.jButton1.isSelected()) { 

        for (int i = 1; i < tot_dense + 1; i++) { 
         for (int d = 1; d < days + 1; d++) { 
          dc.Day_900(); 

          pst.setInt(1, dc.time()); 
          pst.setInt(2, dc.heure); 
          pst.setString(3, "fgf"); 
          pst.setFloat(4, 84/10); 
          pst.setFloat(5, dc.Hourly_Traffic_900); 
          pst.setInt(6, 1); 
          pst.setInt(7, 900); 

          pst.addBatch(); 
         } 
        } 
        pst.executeLargeBatch(); 
        //pst.executeBatch(); 
        c.commit(); 
       } 

      } 
     } catch (SQLException exp) { 
      exp.printStackTrace();Ï 
     } 
    } catch (ClassNotFoundException exp) { 
     exp.printStackTrace(); 
    } 
} 

看一看The try-with-resources Statement一些更多的細節。

說了這麼多,那跳出來的是接下來的事情......

JavaApplication8 dc = new JavaApplication8(); 
Menu mm = new Menu(); 

您使用mm檢查的一些單選按鈕的狀態,因此,除非Menu是一些模態對話框種類或單選按鈕的默認選擇狀態設置爲true,這是不可能的更新代碼將永遠執行

但它並沒有停止在那裏,看看第一個代碼片段引發一些額外的問題.. 。

try { 
    stmt = c.createStatement(); 
    JavaApplication8 dc = new JavaApplication8(); 
    String sql = "INSERT INTO records (start_date,hour,cell_name,Erlang,ErlangU,cell_type,freq_type) VALUES (?,?,?,?,?,?,?)"; 
    PreparedStatement pst = c.prepareStatement(sql); 
    pst.setInt(1, dc.time()); 
    pst.setInt(2, heure); 
    pst.setString(3, "fgf"); 
    pst.setFloat(4, 84/10); 
    pst.setFloat(5, dc.Hourly_Traffic_900); 
    pst.setInt(6, 1); 
    pst.setInt(7, 900); 

    stmt.execute(sql); 
    stmt.close(); 
    c.commit(); 
    c.close(); 
} catch (ClassNotFoundException | SQLException e) { 
    System.err.println(e.getClass().getName() + ": " + e.getMessage()); 
    System.exit(0); 
} 

我不知道JavaApplication8是什麼,但它令我擔心,因爲您依賴於該類的信息。

您同時使用StatementPreparedStatement,但你execute只有Statement這是沒有意義的查詢是建立一個PreparedStatement,所以這只是一個混亂的爛攤子。

如果一切都成功了,你也只關閉資源,如果查詢失敗,會發生什麼情況,SQLException?這些資源保持開放!見The try-with-resources Statement一個更好的解決方案

所以,相反,代碼「可能」看起來更多的東西一樣......

try (Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/Records", "postgres", "21262050")) { 
    JavaApplication8 dc = new JavaApplication8(); 
    String sql = "INSERT INTO records (start_date,hour,cell_name,Erlang,ErlangU,cell_type,freq_type) VALUES (?,?,?,?,?,?,?)"; 
    try (PreparedStatement pst = c.prepareStatement(sql)) { 
     pst.setInt(1, dc.time()); 
     pst.setInt(2, heure); 
     pst.setString(3, "fgf"); 
     pst.setFloat(4, 84/10); 
     pst.setFloat(5, dc.Hourly_Traffic_900); 
     pst.setInt(6, 1); 
     pst.setInt(7, 900); 
     pst.executeUpdate(); 
    } 
} catch (SQLException e) { 
    System.err.println(e.getClass().getName() + ": " + e.getMessage()); 
    System.exit(0); 
} 
System.out.println("Records created successfully"); 

例如