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); } }
展开
 我来答
马亦丁
2014-12-10 · TA获得超过166个赞
知道小有建树答主
回答量:105
采纳率:0%
帮助的人:87.4万
展开全部
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循环以外调用。
追问
我上面有代码,能不能复制搞完整一点,我顺序可能弄错了,运行不出来。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);
  }
 }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
balsum
推荐于2016-03-27 · TA获得超过311个赞
知道小有建树答主
回答量:188
采纳率:100%
帮助的人:184万
展开全部

去掉第一个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)

 字数有限制。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
歌想k
2014-12-10
知道答主
回答量:36
采纳率:0%
帮助的人:10.6万
展开全部
rs.next(); 去掉就显示3行了
追问

这样吗,显示已关闭结果集

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式