2016-03-23 18 views
3

Kullanarak Seçme alınamıyor Bir kayıt bulmaya çalışıyorum. Hangi benim Stored Procedure kullanarak benim veritabanında mevcut bir kayıt bulmayı seçmeme izin verin. Mevcut bir veriyi aramaya çalıştığımda bana istediğim değeri vermez. Arama düğmesine bastığımda, değeri metin alanına yazdırmıyor.İstenen değeri Kayıtlı Yordam

KOD Prosedürü

CREATE PROCEDURE getSECTION_NAME(IN ID INT, OUT NAME VARCHAR(50)) 
SELECT * FROM allsections_list WHERE SECTION_ID = ID AND SECTION_NAME = NAME 

Tablo

CREATE TABLE 
(
SECTION_ID INT PRIMARY KEY AUTO_INCREMENT, 
SECTION_NAME VARCHAR(50) NOT NULL 
) 

Herhangi bir yardım ederim Saklanan

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

    String searchSection = Section_SearchSection_Textfield.getText(); 
    String searchSection_Name = Section_SectionName_TextField.getText(); 
    int sectionID = 0; 

    if (searchSection.isEmpty()) 
    { 
     JOptionPane.showMessageDialog(null, "Please fill up this fields"); 
    } 
    else 
     try (Connection myConn = DBUtil.connect()) 
     { 
      try (CallableStatement myFirstCs = myConn.prepareCall("{call getSECTION_NAME(?,?)}")) 
      { 
       myFirstCs.setInt(1, sectionID);// I set the ID for Primary Key 
       myFirstCs.registerOutParameter(2, Types.VARCHAR); 
       myFirstCs.setString(2, searchSection_Name); 


       boolean hasresults = myFirstCs.execute(); 

      if (hasresults) 
      { 
      try (ResultSet myRs = myFirstCs.getResultSet()) 
      { 
       int resultsCounter = 0; 
       while (myRs.next()) 
       { 
        sectionID = myRs.getInt("SECTION_ID"); 
        String sectionName = myRs.getString(2); 
        Section_SectionName_TextField.setText(sectionName);//Set the value of text 
        Section_SectionName_TextField.setEnabled(true);//Set to enable 

        resultsCounter++; 

       }//end of while 
       }//end of if 
       }//end of resultset 
      }//end of callablestatement 
     }//end of connection 
     catch (SQLException e) 
     { 
      DBUtil.processException(e); 
     } 
} 

takdir edilmek! Teşekkürler!

Güncelleştirme! Kayıtlı Prosedürü okuduğuma göre bir sonuç kümesi döndürebilir. OUT parametresinin değerlerini almak istiyorum.

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           
    String searchSection = Section_SearchSection_Textfield.getText(); 
    String searchSection_Name = Section_SectionName_TextField.getText(); 

    if (searchSection.isEmpty()) 
    { 
     JOptionPane.showMessageDialog(null, "Please fill up this fields"); 
    } 
    else 
     try (Connection myConn = DBUtil.connect(); 
      CallableStatement myFirstCs = myConn.prepareCall("{call getSECTION_NAME(?,?)}")) 
     { 

      myFirstCs.setInt(1, sectionID);// I set the ID for Primary Key 
      myFirstCs.registerOutParameter(2, Types.VARCHAR); 

      boolean hasresults = myFirstCs.execute(); 

     if (hasresults) 
     { 
     try (ResultSet myRs = myFirstCs.getResultSet()) 
     { 
      while (myRs.next()) 
      { 
       sectionID = myRs.getInt("SECTION_ID"); 

       System.out.print(sectionID); 
      }//end of while 

     }//end of resultset 
     }//end of if 
       String sectionName = myFirstCs.getString(2); 
       Section_SectionName_TextField.setText(sectionName);//Set the value of text 
       Section_SectionName_TextField.setEnabled(true);//Set to enable 
       System.out.print(sectionName); 
     }//end of connection 
     catch (SQLException e) 
     { 
      DBUtil.processException(e); 
     } 

} 

Ben Sonuç Kümesi bloktan String sectionName = myRs.getString(2); Section_SectionName_TextField.setText(sectionName); Section_SectionName_TextField.setEnabled(true); çıkarılıp çağrılabilir Bildirimi bloğunda koydu. Programı çalıştırdığımda. Tek değişiklik, metin alanının etkinleştirilmesi ve bana "boş" bir değer yazdırmasıdır.

2 Güncelleme! Ben almak için Sonuç Seti kullanmamam gereken OUT parametresi değerlerini döndürmek istiyorum. Bu yüzden @Gord Thompson'a göre saklanan prosedürün OUT parametresiyle Callable Statement parametresini kullandım.

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           
    String searchSection = Section_SearchSection_Textfield.getText(); 
    String searchSection_Name = Section_SectionName_TextField.getText(); 
    if (searchSection.isEmpty()) 
    { 
     JOptionPane.showMessageDialog(null, "Please fill up this fields"); 
    } 
    else 
     try (Connection myConn = DBUtil.connect(); 
      CallableStatement myFirstCs = myConn.prepareCall("{call getSECTION_NAME(?,?)}")) 
     { 

      myFirstCs.setInt(1, 2);// I set the ID for Primary Key 
      myFirstCs.registerOutParameter(2, Types.VARCHAR); 
      myFirstCs.execute(); 

      String sectionName = myFirstCs.getString(2); // retrieve value from OUT parameter 
      Section_SectionName_TextField.setText(sectionName);//Set the value of text 
      Section_SectionName_TextField.setEnabled(true);//Set to enable 
      System.out.println(sectionName); 

     }//end of connection 
     catch (SQLException e) 
     { 
      DBUtil.processException(e); 
     } 
} 

Bana hala bu değeri almamın neden olmadığı boş değerler veriyor.

enter image description here

benim GUI değişiklik yapılan tek bir metin alanıdır etkin hale gelir ve ben şu yazı bölümünde istediğiniz değeri baskı yer etmedi. yanıt için :(

enter image description here

sayesinde yorum yapmaktan çekinmeyin

+0

@SashaSalauyou Hi! Lütfen güncellenmiş gönderiye bakın. Teşekkürler :) – Francisunoxx

+0

@SashaSalauyou Sorguyu çalıştırdığımda ve bana bir hata atar. 'Son;' sadece satır 3 yakınındaki hatayı göstermiyor. Teşekkürler. – Francisunoxx

+0

Bu arada, Java kod örneğiniz kesinlikle tamamlanmadı, çünkü "if" olmadan bir "else" ile başlıyor. Ve kodun ortasında biter. Bu şekilde size yardımcı olmak çok zor. Tüm sınıf kaynak kodu bile olmasa bile en azından eksiksiz yöntemi sağlayın. –

cevap

0

Eğer daha farklı bir şeye sınırlayıcı değiştirmek için delimiter kullanmalıdır ";" prosedürü oluştururken:..

delimiter // 
CREATE PROCEDURE getSECTION_NAME(IN ID INT, OUT NAME VARCHAR(50)) 
BEGIN 
    SELECT SECTION_NAME INTO NAME FROM allsections_list WHERE SECTION_ID = ID; 
END  
// 
delimiter ; 

İlk delimiter ifadesi, sınırlayıcıyı "//" olarak ayarlar. Bu şekilde, saklı yordam kodunuzdaki ";" artık sınırlayıcı olarak yorumlanmaz. CREATE PROCEDURE deyiminiz doğru "//" ile biter. Tersine, ikinci delimiter ifadesi, ayırıcıyı ";" olarak değiştirir.

+0

@Mia Legaspi NullPointerException'ın yığın izini gönderir misiniz? Teşekkürler –

+0

Zaten gönderiimi güncelledi. Cevap verdiğiniz için teşekkür ederim. :) – Francisunoxx

+0

Üzgünüz, ama: Bir İstisna'nın yığın izinin ne olduğunu biliyor musunuz? Bak burada: http://stackoverflow.com/questions/3988788/what-is-a-stack-trace-and-how-can- I-use-it-debug-my-application-errors –

2

Saklı yordamın OUT parametresi aracılığıyla döndürülen değeri istiyorsanız, ResultSet'i kullanmazsanız, saklı yordamın OUT parametresiyle ilişkili CallableStatement parametresini kullanırsınız.Örneğin, içeren test tablo

CREATE TABLE `allsections_list` (
`SECTION_ID` int(11) NOT NULL, 
`SECTION_NAME` varchar(50) DEFAULT NULL, 
PRIMARY KEY (`SECTION_ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

için numune veriler gösterilir

SECTION_ID SECTION_NAME 
---------- --------------- 
     1 one_section 
     2 another_section 

ve saklı prosedür

CREATE PROCEDURE `getSECTION_NAME`(IN myID INT, OUT myName VARCHAR(50)) 
BEGIN 
    SELECT SECTION_NAME INTO myName FROM allsections_list WHERE SECTION_ID = myID; 
END 

aşağıdaki Java kodu

try (CallableStatement myFirstCs = conn.prepareCall("{call getSECTION_NAME(?,?)}")) { 
    myFirstCs.setInt(1, 2); // set IN parameter "myID" to value 2 
    myFirstCs.registerOutParameter(2, Types.VARCHAR); 
    myFirstCs.execute(); 
    String sectionName = myFirstCs.getString(2); // get value from OUT parameter "myName" 
    System.out.println(sectionName); 
} 

baskı

another_section 
+0

Merhaba! Lütfen güncellenmiş gönderiye bakın. Burada gönderdiğiniz kodları takip ediyorum ve hala bana boş değerler veriyor :(ve sonuncusu benim parametremde neden 2 tane koymalıyım? MyFirstCs.setInt (1, 2); // Neden 2 koymalıyım? yanıtı – Francisunoxx

+0

Örnek kodumda, "myID" saklı yordamında '2' ve 'SELECT', 'SECTION_NAME' değerine karşılık gelen 'SECTION_ID = 2 değerine kadar sakladım. Kodunuzun "SECTION_ID = 7" ye karşılık gelen "SECTION_NAME" değerine bakmasını istiyorsanız, "myFirstCs.setInt (1, 7);" . –

+0

Oh! Hayat kurtarıcınız :)) anla. Yani, parametrenin 2. değeri, sütunun indeksinin # değeridir. Son sorum. Ne aramak istediğime bağlı olarak mevcut bir kaydı bulmak istersem? Kimlik No'yu çağırmadan? Tekrar teşekkürler! :) – Francisunoxx