无法检索使用存储过程选择的值 [英] Cannot retrieve the value I desired to Select using Stored Procedure
问题描述
我正在努力寻找记录。这让我选择使用存储过程在我的数据库中查找现有记录。当我试图搜索现有数据时,它没有给我我想要的价值。当我点击搜索按钮时,它不会将值打印到文本字段。
I'm trying to find a record. Which let me choose to find a existing record in my database using Stored Procedure. When I tried to search a existing data it doesn't give me the value that I want. When I hit the search button it's not printing the value to the textfield.
代码
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
)
任何帮助将不胜感激!谢谢!
Any help would be appreciated! Thanks!
更新!
根据我读到的内容,Stored Procedure可以返回结果集。我想检索OUT参数的值。
Update! According to what I read Stored Procedure can return a result set. I want to retrieve the values of the OUT parameter.
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);
I removed the
String sectionName = myRs.getString(2);
Section_SectionName_TextField.setText(sectionName);
Section_SectionName_TextField.setEnabled(true);
out of the Result Set block and put it in the Callable Statement block. When I run the program. The only changes is the textfield become enabled and prints me a "null" value.
第二次更新!
我想返回OUT参数的值我不应该使用结果集来检索它。所以我根据@Gord Thompson使用Callable Statement参数和存储过程的OUT参数。
2nd Update! I want to returned the values of OUT parameter I should not use Result Set to retrieve it. So I used Callable Statement parameter with OUT parameter of stored procedure according to @Gord Thompson.
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);
}
}
它仍然给我一个空值我不在为什么我得到这个价值。
Its still giving me a null values where I don't why I getting this value.
只有对我的GUI的更改才会启用文本字段,并且它不会在以下文本字段中打印我想要的值。 :(
The only changes to my GUI is the textfield become enabled and it's not printing the value I want in the following textfield. :(
感谢您的回复。感觉自由评论。
Thanks for responding. Feel free to comment.
推荐答案
如果你想要通过存储过程的OUT参数返回的值那么你就不要使用了在ResultSet中,您使用与存储过程的OUT参数关联的CallableStatement参数。例如,对于测试表
If you want the value that is returned via an OUT parameter of a stored procedure then you don't use a ResultSet, you use the CallableStatement parameter associated with the OUT parameter of the stored procedure. For example, for the test table
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代码
then the following 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);
}
打印
another_section
这篇关于无法检索使用存储过程选择的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!