2016-03-23 8 views
3

Ich versuche einen Datensatz zu finden. Mit dieser Option kann ich einen vorhandenen Datensatz in meiner Datenbank mit Stored Procedure suchen. Wenn ich versuchte, vorhandene Daten zu durchsuchen, gibt es mir nicht den Wert, den ich möchte. Wenn ich die Suchschaltfläche drücke, wird der Wert nicht in das Textfeld gedruckt.Der gewünschte Wert kann nicht mit Stored Procedure abgerufen werden

CODE

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); 
     } 
} 

Stored Procedure

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

Tabelle

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

Jede mögliche Hilfe werde geschätzt! Vielen Dank!

Aktualisierung! Nach was ich gelesen habe, kann Stored Procedure eine Ergebnismenge zurückgeben. Ich möchte die Werte des Parameters OUT abrufen.

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); 
     } 

} 

Ich entfernte die String sectionName = myRs.getString(2); Section_SectionName_TextField.setText(sectionName); Section_SectionName_TextField.setEnabled(true); aus dem Set Block Ergebnis und im Callable Statement Block setzen. Wenn ich das Programm starte. Die einzige Änderung ist, dass das Textfeld aktiviert wird und mir einen "Null" -Wert gibt.

2. Update! Ich möchte die Werte von OUT-Parameter zurückgegeben. Ich sollte Result Set nicht verwenden, um es abzurufen. Also habe ich Callable Statement-Parameter mit OUT-Parameter der gespeicherten Prozedur nach @Gord Thompson verwendet.

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); 
     } 
} 

Sein geben mir noch ein Null-Werte, bei denen ich nicht, warum ich diesen Wert zu bekommen.

enter image description here

Die einzigen Änderungen an meinem GUI ist das Textfeld aktiviert werden und es wird Druck nicht den Wert I in das vorgesehene Feld wollen. :(

enter image description here

Danke für Ihre Reaktion Fühlen Sie sich frei zu äußern

+0

@SashaSalauyou Hallo! Bitte sehen Sie meinen aktualisierten Beitrag. Danke :) – Francisunoxx

+0

@SashaSalauyou Wenn ich die Abfrage ausführen und mir einen Fehler wirft. 'Das Ende;' zeigt nicht nur den Fehler in Zeile 3 an. Danke. – Francisunoxx

+0

Übrigens, Ihr Java-Codebeispiel ist definitiv nicht vollständig, da es mit einem "else" ohne ein "if" beginnt. Und es endet in der Mitte des Codes. Auf diese Weise ist es schwer dir zu helfen. Bitte geben Sie mindestens die vollständige Methode an, wenn nicht sogar den gesamten Klassenquellcode. –

Antwort

0

sollten Sie delimiter verwenden Sie das Trennzeichen etwas anderes als ändern „“ wenn Sie die Prozedur zu erstellen:..

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 ; 

Die erste delimiter-Anweisung setzt das Trennzeichen auf "//". Auf diese Weise wird das ";" in Ihrem gespeicherten Prozedurcode nicht mehr als Trennzeichen interpretiert. Ihre CREATE PROCEDURE Anweisung dann korrekt endet bei "//". Im Folgenden ändert die zweite Anweisung delimiter das Trennzeichen zurück in ";".

+0

@Mia Legaspi Könnten Sie bitte den Stack-Trace der NullPointerException veröffentlichen? Danke –

+0

Bereits aktualisiert mein Beitrag. Danke für das Antworten. :) – Francisunoxx

+0

Entschuldigung, aber: Wissen Sie, was ein Stack-Trace einer Exception ist? Schauen Sie hier: http://StackOverflow.com/Questions/3988788/what-is-a-Stack-Trace-and-how-can- i-use-it-to-debug-my-Anwendungsfehler –

2

Wenn Sie möchten, dass der Wert, der über einen OUT-Parameter einer gespeicherten Prozedur zurückgegeben wird, kein ResultSet verwendet, verwenden Sie den CallableStatement-Parameter, der dem OUT-Parameter der gespeicherten Prozedur zugeordnet ist.Zum Beispiel für die Testtabelle

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 

die Probendaten

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

und die gespeicherte Prozedur enthält

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 

dann die folgenden Java-Code

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); 
} 

druckt

another_section 
+0

Hallo! Bitte sehen Sie meinen aktualisierten Beitrag. Ich folge den Codes, die du hier gepostet hast, und gib mir immer noch null Werte :(und das letzte, warum sollte ich 2 in meinen Parameter setzen? 'MyFirstCs.setInt (1, 2); // Warum sollte ich 2 setzen?' Danke für Antwort: – Francisunoxx

+0

In meinem Beispielcode habe ich den Wert '2' für den ersten Parameter angegeben, also würde in der gespeicherten Prozedur' myID' gleich '2' sein und der' SELECT' würde den 'SECTION_NAME' Wert entsprechend' SECTION_ID = 2 nachschlagen Wenn Sie möchten, dass Ihr Code den 'SECTION_NAME' Wert nach' SECTION_ID = 7' sucht, dann würden Sie 'myFirstCs.setInt (1, 7);' verwenden. –

+0

Oh! Ihr ein Lebensretter :)) Ich schon Hole es. Also ist der zweite Wert des Parameters die Nummer des Index der Spalte. Meine letzte Frage. Was ist, wenn ich einen vorhandenen Datensatz suchen möchte, abhängig davon, was ich suchen möchte? Ohne die Nummer der ID zu nennen? Danke noch einmal! :) – Francisunoxx