我正在试图浏览并显示从我的SQL语句中检索到的每条记录,然后将它们显示在TextFields中。
我认为我已经接近正确但是它正在显示最后一条记录。
我需要通过点击相同的按钮('下一步')来导航。我怀疑我需要将结果存储到数组中吗?
这是一个库存管理系统,只是为了将其置于上下文中。
感谢您提供的任何帮助:)
JAVA:
// Stock Search ActionListener
submit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
try{
Class.forName(DRIVER);
// Connection to the Database
con = DriverManager.getConnection(DATABASE_URL,"root","");
// Gets text from textfields and assigns them to variables
s1 = tfKeywords.getText();
// Gets ComboBox Selected Item
s2 = (String)cb.getSelectedItem();
//Creates Statement Connection
Statement st = con.createStatement();
// SQL Statements
st.executeQuery("SELECT * FROM "+s2+" WHERE Title LIKE '%"+s1+"%'");
// Extracts data from statement to a result set
ResultSet rs = st.getResultSet();
while (rs.next()) {
tfResultsTitle.setText(rs.getString("Title"));
tfResultsReleaseT.setText(rs.getString("ReleaseType"));
tfResultsType.setText(rs.getString("Type"));
tfResultsGenre.setText(rs.getString("Genre"));
tfResultsPrice.setText(rs.getString("Price"));
tfResultsDeal.setText(rs.getString("Deal"));
tfResultsInStock.setText(rs.getString("InStock"));
tfResultsLastRec.setText(rs.getString("LastRec"));
tfResultsLastSold.setText(rs.getString("LastSold"));
tfResultsBarcode.setText(rs.getString("Barcode"));
}
}
// SQL Catch block to catch errors
catch(SQLException s){
}
// Catch block to catch ActionListener errors
catch (Exception e1){
}
};
});
答案 0 :(得分:0)
alawys之所以只是显示最后一个条目的原因是因为你很好地告诉它。对rs.next()
的调用设置了一个指向下一行的内部指针(如果可用),并且在有条目的情况下返回一个布尔值。
现在我们如何解决您的问题。我可以直接思考两种可能性。首先,您可以创建一个新按钮( Next )来处理ResultSet。这种方式的工作方式是你有一个按钮用于请求一个新的Resultset(连接到数据库),然后隐藏这个按钮,然后显示下一个按钮,直到每一个完成并且然后再次交换它们(就可见性而言)。
我更喜欢自己的另一个解决方案看起来与此相似:
private ResultSet results = null;
submit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// if there isn't any ResultSet or the current one is empty/done
if(results == null || !results.next())
{
try{
Class.forName(DRIVER);
// Connection to the Database
con = DriverManager.getConnection(DATABASE_URL,"root","");
// Gets text from textfields and assigns them to variables
s1 = tfKeywords.getText();
// Gets ComboBox Selected Item
s2 = (String)cb.getSelectedItem();
//Creates Statement Connection
Statement st = con.createStatement();
// SQL Statements
st.executeQuery("SELECT * FROM "+s2+" WHERE Title LIKE '%"+s1+"%'");
// Extracts data from statement to a result set
results = st.getResultSet();
if(results.next())
{
setTexts(results);
}
}
// SQL Catch block to catch errors
catch(SQLException s){
}
// Catch block to catch ActionListener errors
catch (Exception e1){
}
}else
{
setTexts(results);
}
};
});
这是如何工作的?它只是存储最新的ResultSet
,并且只在没有ResultSet或当前完成的情况下才会对数据库发出调用。
但是为什么我们可以调用我们的方法来将数据打印到文本字段而不再在else块中再次调用results.next()
?
在致电if(.. || !rs.next())
时,我们已经调用next()
已经将内部指针设置为正确的条目。
编辑:
setTexts(ResultSet rs)
方法如何/应该如何显示:
public void setTexts(ResultSet rs)
{
tfResultsTitle.setText(rs.getString("Title"));
tfResultsReleaseT.setText(rs.getString("ReleaseType"));
tfResultsType.setText(rs.getString("Type"));
tfResultsGenre.setText(rs.getString("Genre"));
tfResultsPrice.setText(rs.getString("Price"));
tfResultsDeal.setText(rs.getString("Deal"));
tfResultsInStock.setText(rs.getString("InStock"));
tfResultsLastRec.setText(rs.getString("LastRec"));
tfResultsLastSold.setText(rs.getString("LastSold"));
tfResultsBarcode.setText(rs.getString("Barcode"));
}