无法检索使用存储过程选择的值

我正在努力寻找记录。 这让我选择使用存储过程在我的数据库中查找现有记录。 当我试图搜索现有数据时,它没有给我我想要的价值。 当我点击搜索按钮时,它不会将值打印到文本字段。

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

存储过程

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

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

任何帮助,将不胜感激! 谢谢!

更新! 根据我读到的存储过程可以返回结果集。 我想检索OUT参数的值。

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

我删除了String sectionName = myRs.getString(2); Section_SectionName_TextField.setText(sectionName); Section_SectionName_TextField.setEnabled(true); String sectionName = myRs.getString(2); Section_SectionName_TextField.setText(sectionName); Section_SectionName_TextField.setEnabled(true); 超出结果集块并将其放入可调用语句块中。 当我运行程序时。 唯一的变化是文本字段变为启用并打印出“空”值。

在此处输入图像描述

第二次更新! 我想返回OUT参数的值我不应该使用Result Set来检索它。 所以我根据@Gord Thompson使用Callable Statement参数和存储过程的OUT参数。

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

它仍然给我一个空值,我不知道为什么我得到这个值。

在此处输入图像描述

我的GUI的唯一更改是文本字段已启用,并且它不会在以下文本字段中打印我想要的值。 🙁

在此处输入图像描述

谢谢你的回复。 随意评论。

如果需要通过存储过程的OUT参数返回的值,则不使用ResultSet,则使用与存储过程的OUT参数关联的CallableStatement参数。 例如,对于测试表

 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 

包含样本数据

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

和存储过程

 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 

然后是以下Java代码

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

版画

 another_section 

你应该使用delimiter将分隔delimiter更改为不同于“;”的分隔符 在创建过程时:

 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 ; 

第一个delimiter语句将分隔delimiter设置为“//”。 这样,“;” 在您的存储过程代码中不再被解释为分隔符。 然后,您的CREATE PROCEDURE语句正确地以“//”结束。 Aftwerwards,第二个delimiter语句将分隔delimiter更改回“;”。

Interesting Posts