2017-10-06 60 views
-1

我使用單個配置單元jdbc驅動程序訪問來自兩個不同數據庫的數據的完整代碼。我在下一個數據庫連接上獲得sql異常,然後才能正常工作。請告訴我一些解決方案,以進一步處理。當下一個準備好的語句查詢拋出sql異常時。但做一個單獨的按鈕動作,它工作正常,而我在做一個單一的行動,它會引發錯誤。我可以在使用java swing執行的單個按鈕操作中使用兩個連接語句嗎?

String s1 = jTextField1.getText(); 
    String s2 = jTextField2.getText(); 
    String s3 = jTextField3.getText(); 
    String s4 = new String(jPasswordField1.getPassword()); 

    try { 
     Class.forName("org.apache.hive.jdbc.HiveDriver"); 
     Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/twitter_db", "arunachalam", ""); 
     Statement st = con.createStatement(); 
     String sql = "select dbname,tbname from check where userid='" + s3 + "'and tbname='" + s2 + "'"; 
     String sql1 = "select userid,password from user_reg where userid='" + s3 + "'"; 
     ResultSet rs = st.executeQuery(sql); 
     try { 
      PreparedStatement ps = con.prepareStatement(sql1); 
      ResultSet rs1 = ps.executeQuery(); 
      while (rs.next() && rs1.next()) { 
       if ((rs.getString("dbname").equals(s1)) && (rs.getString("tbname").equals(s2)) && (rs1.getString("userid").equals(s3)) && (rs1.getString("password").equals(s4))) { 
        jSeparator1.setVisible(true); 
        jScrollPane1.setVisible(true); 
        try { 

         Connection con1 = DriverManager.getConnection("jdbc:hive2://localhost:10000/" + s1, "arunachalam", ""); 
         ArrayList<Tweet> list = new ArrayList<Tweet>(); 
         String ve = "select id,created_at,source,favorited,retweet_count,retweeted_status,entities,text,user,in_reply_to_screen_name from " + s2; 
         PreparedStatement ps1 = con1.prepareStatement(ve); 
         ResultSet rs2 = ps1.executeQuery(); 
         Tweet tweet; 
         while (rs2.next()) { 
          tweet = new Tweet(rs.getLong("id"), rs.getString("created_at"), rs.getString("source"), rs.getBoolean("favorited"), rs.getInt("retweet_count"), rs.getString("retweeted_status"), rs.getString("entities"), rs.getString("text"), rs.getString("user"), rs.getString("in_reply_to_screen_name")); 
          list.add(tweet); 

          String[] columnName = {"Tweet_ID", "Created_At", "Source", "Favorited", "Retweet_Count", "Retweeted_Status", "Entities", "Text", "User", "Screen_Name"}; 

          Object[][] twt = new Object[list.size()][10]; 

          for (int i = 0; i < list.size(); i++) { 
           twt[i][0] = list.get(i).gettweetid(); 
           twt[i][1] = list.get(i).getcreated(); 
           twt[i][2] = list.get(i).getsource(); 
           twt[i][3] = list.get(i).getfavor(); 
           twt[i][4] = list.get(i).getcount(); 
           twt[i][5] = list.get(i).getstatus(); 
           twt[i][6] = list.get(i).getentities(); 
           twt[i][7] = list.get(i).gettext(); 
           twt[i][8] = list.get(i).getuser(); 
           twt[i][9] = list.get(i).getscreen(); 

           TheModel model = new TheModel(twt, columnName); 
           jTable1.setModel(model); 
           jTable1.setRowHeight(20); 
          } 
         } 
        } catch (Exception e) { 
         showMessageDialog(null, e); 
        } 
        break; 
       } else if ((!rs.getString("dbname").equals(s1)) && (rs.getString("tbname").equals(s2)) && (rs1.getString("userid").equals(s3)) && (rs1.getString("password").equals(s4))) { 
        JOptionPane.showMessageDialog(null, "Database Name is Incorrect", "Error", JOptionPane.ERROR_MESSAGE); 
        break; 
       } else if ((rs.getString("dbname").equals(s1)) && (!rs.getString("tbname").equals(s2)) && (rs1.getString("userid").equals(s3)) && (rs1.getString("password").equals(s4))) { 
        JOptionPane.showMessageDialog(null, "Table Name is Incorrect", "Error", JOptionPane.ERROR_MESSAGE); 
        break; 
       } else if ((rs.getString("dbname").equals(s1)) && (rs.getString("tbname").equals(s2)) && (rs1.getString("userid").equals(s3)) && (!rs1.getString("password").equals(s4))) { 
        JOptionPane.showMessageDialog(null, "Password is Incorrect", "Error", JOptionPane.ERROR_MESSAGE); 
        break; 
       } else if ((!rs1.getString("userid").equals(s3)) && (rs.getString("dbname").equals(s1)) && (rs.getString("tbname").equals(s2)) && (rs1.getString("password").equals(s4))) { 
        JOptionPane.showMessageDialog(null, "User ID is Incorrect", "Error", JOptionPane.ERROR_MESSAGE); 
        break; 
       } else { 
        JOptionPane.showMessageDialog(null, "Access Denied", "Error", JOptionPane.ERROR_MESSAGE); 

       } 
      } 
     } catch (Exception e) { 
      showMessageDialog(null, e); 
     } 
    } catch (Exception e) { 
     showMessageDialog(null, e); 
    } 
+0

你試過嗎?爲什麼不可能呢? – Stultuske

+0

你也不需要'Class.forName(「org.apache.hive.jdbc.HiveDriver」);'你**當然**不需要它兩次。 – Kayaman

回答

1

來響應,因爲應用程序將凍結期間的actionPerformed使用 invokeLater。 是不同用戶的單獨連接,一個用於只讀,一個用於管理任務,是很有可能的。但是我沒有看到致電close()。 (也有單用戶(如嵌入式)數據庫可能無法做到的。)

自動關閉連接,語句和結果集使用試穿與資源try (DECLARATION; ... ; DECLARATION) { ... } - 節省了不少。

當前驅動程序不再需要顯式類加載Class.forName

// Java的8

SwingUtilities.invokeLater(() -> { 
    String sql = "select dbname, tbname from check where userid=? and tbname=?"; 
    try (Connection con = DriverManager.getConnection(
      "jdbc:hive2://192.168.1.13:10000/twitter_db", "arunachalam", ""); 
      PreparedStatement st = con.prepareStatement(sql)) { 
     st.setString(1, s3); 
     st.setString(2, s2); 
     try (ResultSet rs = st.executeQuery()) { 
      if (rs.next()) { 

       List<Tweet> list = new ArrayList<>(); 
       String hive = "select id,created_at,source,favorited,retweet_count," 
        + "retweeted_status,entities,text,user,in_reply_to_screen_name from " 
        + s2; 

       try (Connection con1 = DriverManager.getConnection(
         "jdbc:hive2://localhost:10000/"+s1, "arunachalam", ""); 
          PreparedStatement ps1 = con1.prepareStatement(hive); 
          ResultSet rs2 = ps1.executeQuery()) { 
    ... 
}); 
相關問題