JAVA查询数据库记录少了第一行,而且无法显示列名。我下面注释有显示列名的方法,加上去说结果集已关闭
privatevoidjTextField1ActionPerformed(java.awt.event.ActionEventevt){Stringsql,strval...
private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) { String sql,strval="";
try{ conn=DriverManager.getConnection(url);
stmt=conn.createStatement();
sql="select SC.sno,sname,cname,grade from student,SC,course where SC.sno=student.sno and course.cno=sc.cno and sc.sno='"+jTextField1.getText()+"'"; //查询文本字段1输入学号的学生信息 ResultSet rs=stmt.executeQuery(sql);
rs.next();
/* ResultSet rs1=stmt.executeQuery("select sc.sno,sname,cname,grade from student,sc,course"); rs1.next(); */ //读取sc,student,course表的列名,显示在文本框的第一行 ResultSetMetaData metaData = rs.getMetaData();
jTextArea1.setText(strval);
if(rs.getRow()>=1){
int numberofColumns = metaData.getColumnCount();
for(int i=1;i<=numberofColumns;i++){
strval+=metaData.getColumnName(i)+"\t"; }
strval+="\n";
while(rs.next()) { strval=rs.getString("sno")+"\t"+rs.getString("sname")+"\t" +rs.getString("cname")+"\t"+rs.getInt("grade") +"\n";
jTextArea1.append(strval); } }
else
JOptionPane.showMessageDialog(null, "找不到此学生的学号","错误",JOptionPane.ERROR_MESSAGE); }catch(SQLException e){ JOptionPane.showMessageDialog(null, e.getMessage(),"错误",JOptionPane.ERROR_MESSAGE); } } 展开
try{ conn=DriverManager.getConnection(url);
stmt=conn.createStatement();
sql="select SC.sno,sname,cname,grade from student,SC,course where SC.sno=student.sno and course.cno=sc.cno and sc.sno='"+jTextField1.getText()+"'"; //查询文本字段1输入学号的学生信息 ResultSet rs=stmt.executeQuery(sql);
rs.next();
/* ResultSet rs1=stmt.executeQuery("select sc.sno,sname,cname,grade from student,sc,course"); rs1.next(); */ //读取sc,student,course表的列名,显示在文本框的第一行 ResultSetMetaData metaData = rs.getMetaData();
jTextArea1.setText(strval);
if(rs.getRow()>=1){
int numberofColumns = metaData.getColumnCount();
for(int i=1;i<=numberofColumns;i++){
strval+=metaData.getColumnName(i)+"\t"; }
strval+="\n";
while(rs.next()) { strval=rs.getString("sno")+"\t"+rs.getString("sname")+"\t" +rs.getString("cname")+"\t"+rs.getInt("grade") +"\n";
jTextArea1.append(strval); } }
else
JOptionPane.showMessageDialog(null, "找不到此学生的学号","错误",JOptionPane.ERROR_MESSAGE); }catch(SQLException e){ JOptionPane.showMessageDialog(null, e.getMessage(),"错误",JOptionPane.ERROR_MESSAGE); } } 展开
3个回答
展开全部
ResultSet rs=stmt.executeQuery(sql);
rs.next(); // 这里有问题,这个就是少一条记录的原因 。你调用了一次next(),然后没有处理这一条记录。
ResultSet rs1=stmt.executeQuery("select sc.sno,sname,cname,grade from student,sc,course");
你只有一个stmt,然后这个stmt又执行了别的sql,这时rs就关闭了,只有rs1打开了。
解决办法是加一个stmt1,和stmt区别开。其实rs1在这里多余了,因为你已经有rs了。
比如改成:
ResultSet rs=stmt.executeQuery(sql);
int count = 1;
while(rs.next()) {
if (count == 1){
count++;
ResultSetMetaData metaData = rs.getMetaData();
...
}
strval=rs.getString("sno")+"\t"+rs.getString...
...
}
总之rs.next()调用一次就消耗一条记录,所以尽量不要在while循环以外调用。
rs.next(); // 这里有问题,这个就是少一条记录的原因 。你调用了一次next(),然后没有处理这一条记录。
ResultSet rs1=stmt.executeQuery("select sc.sno,sname,cname,grade from student,sc,course");
你只有一个stmt,然后这个stmt又执行了别的sql,这时rs就关闭了,只有rs1打开了。
解决办法是加一个stmt1,和stmt区别开。其实rs1在这里多余了,因为你已经有rs了。
比如改成:
ResultSet rs=stmt.executeQuery(sql);
int count = 1;
while(rs.next()) {
if (count == 1){
count++;
ResultSetMetaData metaData = rs.getMetaData();
...
}
strval=rs.getString("sno")+"\t"+rs.getString...
...
}
总之rs.next()调用一次就消耗一条记录,所以尽量不要在while循环以外调用。
追问
我上面有代码,能不能复制搞完整一点,我顺序可能弄错了,运行不出来。if和else的位置搞不对,显示结果乱七八糟的。复制我上面的代码把顺序弄对吧。
else的位置不懂放哪,我放哪都出错
追答
private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {
String sql, strval = "";
try {
conn = ...
stmt = ...
sql = ...
ResultSet rs = stmt.executeQuery(sql);
int count = 0;
while (rs.next()) {
count++;
if (count == 1) {
ResultSetMetaData metaData = rs.getMetaData();
int numberofColumns = metaData.getColumnCount();
for (int i = 1; i <= numberofColumns; i++) {
strval += metaData.getColumnName(i) + "\t";
}
strval += "\n";
}
strval += rs.getString("sno") + "\t" + rs.getString("sname")
+ "\t" + rs.getString("cname") + "\t"
+ rs.getInt("grade") + "\n";
}
jTextArea1.append(strval);
rs.close();
stmt.close();
conn.close();
if (count == 0) {
JOptionPane.showMessageDialog(null, "找不到此学生的学号", "错误",
JOptionPane.ERROR_MESSAGE);
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "错误",
JOptionPane.ERROR_MESSAGE);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
去掉第一个rs.next();试试
即
ResultSet rs=stmt.executeQuery(sql);
//rs.next();
更多追问追答
追答
ResultSet rs = stmt.executeQuery(sql);
//查询文本字段1输入学号的学生信息...(删除)...显示在文本框的第一行
ResultSetMetaData metaData = rs.getMetaData();
int numberofColumns = metaData.getColumnCount();
for (int i = 1; i <= numberofColumns; i++)
strval += metaData.getColumnName(i) + "\t";
strval += "\n";
jTextArea1.setText(strval);//列名可以列出。之前的先jTextArea1.setText(strval)再strval += 不会改变jTextArea1的text,setText要在给strval赋值完后
//if(rs.getRow()>=1){ 判断删除,包括后面的else
// rs.getRow();//是返回当前行号,而不是总行数。可以用下面三行代码实现。
//rs.last();
//int rowCount=rs.getRow();
//rs.beforeFirst();
//boolean b = false;//或者用布尔值
while (rs.next()) {
//b = true;
}
//if(rowCount > 0) //if(!b)
字数有限制。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询