2016-03-24 12 views
0

問題:をぶら下げ

Iデータベースに接続するいくつかのコードは、レコードが基準に基づいて発見されたかどうかを確認してい、レコードが見つかった場合は3を返し、ユーザーがこれらの詳細を持つレコードがすでに存在すると言うメッセージを生成します。レコードがまだ存在しない場合は、挿入クエリを実行してレコードを作成します。

2番目に短い時間連続して実行されたselectクエリは、結果がレコードが見つかったときにハングしているようです(戻り値3、ユーザーにメッセージを出力します)。エラーが報告されず、プログラムのGUIが応答しなくなります(他のオブジェクトをクリックすることができず、ウィンドウを閉じるのに応答しません)。 Netbeansはまだ正常に動作しており、私はそのプログラムの実行を停止することができます。

テスト:

A)私は私の最初の実行が成功した後、同じデータベース上の別のクエリを実行するが、別のテーブルの上に、コードが正しく実行されますが、元のクエリを試してみて、実行するために戻った場合再びハングアップします。

B)コードを実行して結果を戻しても、コードは実行されません。 (下のコードを参照してください)

C)SE上の他の同様の質問のスキャンをしましたが、私の問題の解決策を見つけることができないようです。

使用の資源: ucanaccess-2.0.9.3、NetBeans IDEの8.1、JDK 1.8(起因する会社では、旧バージョンとの互換性の問題に1.6にコンパイル)、MS Accessデータベース、企業ネットワーク上の

コード:

public int insertAddPeriod(String strProjectNumber, String strYear, String strPeriod){ 
    System.out.println("Checking to see if record already exists: " + strProjectNumber + ", Year: " + strYear + ", Period: " + strPeriod); 
    String strSQLString = null; 

    try{ 

     strSQLString = "SELECT Program_No, Year, Period FROM tblCost WHERE Program_No = ? AND Year = ? AND Period = ?"; 

     //SETTING PREPARED STATEMENT 
     PreparedStatement preStatement = con.prepareStatement(strSQLString, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 

     //SETTING FIRST CONDITION OF PREPARED STATEMENT IE ?      
     preStatement.setString(1, strProjectNumber); 
     preStatement.setString(2, strYear); 
     preStatement.setString(3, strPeriod); 

     ResultSet rs = preStatement.executeQuery(); 

     if(rs.next()){ 
      //CLOSES CONNECTIONS 
      rs.close(); 
      preStatement.close();    

      System.out.println("Check Complete; Period Already Exists"); 
      return 3; 
     } 
     else{ 
      System.out.println("Check complete; No Previous Period"); 
      System.out.println("Inserting record: " + strProjectNumber + ", Year: " + strYear + ", Period: " + strPeriod);    
      strSQLString = null; 
      try{ 

       strSQLString = "INSERT INTO tblCost (Program_No, Year, Period) VALUES (?, ?, ?) "; 

       //SETTING PREPARED STATEMENT 
       PreparedStatement preStatement1 = con.prepareStatement(strSQLString, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 

       //SETTING FIRST CONDITION OF PREPARED STATEMENT IE ?      
       preStatement1.setString(1, strProjectNumber); 
       preStatement1.setString(2, strYear); 
       preStatement1.setString(3, strPeriod); 

       //EXECUTE QUERY 
       preStatement1.executeUpdate(); 

       //CLOSES CONNECTIONS 
       preStatement1.close(); 

       System.out.println("Insert Complete"); 

       return 1; 
      }catch(Exception ex){ 
       strEXMessage=ex.getMessage(); 
       System.out.println(strEXMessage); 
       return 2; 
      }   
     } 

    }catch(Exception ex){ 
     strEXMessage=ex.getMessage(); 
     System.out.println(strEXMessage); 
     System.out.println("Check error; Unable to check for previous period"); 
     return 2; 
    } 
} 

private void AddPeriod(){   
    //Create Connection 
    Database db = new Database(); 
    int r = 0; 
    try { 
     r = db.CreateConnection(); 
    } catch (SQLException ex) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (ClassNotFoundException ex) { 
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    //CONNECTION COMPLETE 
    if(r==1){ 
     int q = 0; 
     q = db.insertAddPeriod((String)cbProjectNumber.getSelectedItem(),(String)cbCostYear.getSelectedItem(),(String)cbCostPeriod.getSelectedItem()); 
     if(q==1){        
      System.out.println("Record"); 
      JOptionPane.showMessageDialog(null,"Record added for the period: " + (String)cbCostPeriod.getSelectedItem(),"Complete",JOptionPane.WARNING_MESSAGE);     
     } 
     if(q==2){ 
      System.out.println("Error"); 
      JOptionPane.showMessageDialog(null,"There was an error processing the insert query","Error",JOptionPane.WARNING_MESSAGE); 
     } 
     if(q==3){ 
      System.out.println("Missing"); 
      JOptionPane.showMessageDialog(null,"Record already exists for the selected period","Error",JOptionPane.WARNING_MESSAGE); 
     } 
    } 

    //CONNECTION ERROR 
    if(r==2){ 
     System.out.println("Error"); 
     JOptionPane.showMessageDialog(null,"No connection made","Error",JOptionPane.WARNING_MESSAGE); 
    } 
    //CONNECTION RETURNS EMPTY 
    if(r==3){ 
     System.out.println("No Records"); 
     JOptionPane.showMessageDialog(null,"No records found in table","Missing Records",JOptionPane.WARNING_MESSAGE); 
    } 
} 

    public int CreateConnection() throws SQLException, ClassNotFoundException{ 
    try{ 
     con = DriverManager.getConnection(strDBCon,strDBUser,strDBPass); 
     System.out.println("Connection Passed"); 

     return 1; 
    }catch(SQLException ex){ 
     strEXMessage=ex.getMessage(); 
     System.out.println("Connection Failed: " + ex); 
     return 2; 
    } 
} 

public int CloseConnection(){ 
    try{ 
     con.close(); 
     System.out.println("Connection Closed by User"); 
     return 1; 
    }catch(SQLException ex){ 
     strEXMessage=ex.getMessage(); 
     return 2; 
    } 
} 

(つまり原因でない限り)、乱雑を無視し、それをクリーンアップしてください現時点ではWIPです。

+0

どのように接続を取得し、解放していますか – Rahul

+0

@Rahul krestanosソリューションは完全に私のために働いていましたが、参照用に接続コードとリリースコードで投稿を編集しました。 – ppw

答えて

3

通常、このような場合の非応答プログラムは、コミットされていない挿入、更新、削除のために、データベースの行ロックによって引き起こされます。

あなたのコードでわかるように、あなたは準備されたステートメントをコミットしません。 自動コミットがtrueに設定されていますか? もしそうでなければ、更新を実行した後でcon.commit()を試してください。そしてメソッドの2回目の呼び出しがうまくいくはずです。

+0

チャームのように働いて、ありがとう@krestano – ppw

関連する問題