请高手指教while循环问题

lmy0114 2011-09-02 12:19:56
public void tree(List<Article> articles, Connection conn, int id, int grade ){
String sql = "select * from article where pid = " + id;
Statement stmt = DB.createStmt(conn);
ResultSet rs = DB.executeQuery(stmt, sql);
try{
while(rs.next()){
.......
if(!a.isIsleaf()){
tree(articles, conn, a.getId(), grade+1);
}
}.......

id的值为1,2,3,4,5,6,.....但当id值为3的时候 再次运行时pid值为3 可pid值为3时rs.next()返回值为false 这时候while方法里德程序不运行 直接往下运行,可是id也没自增,当id=4,5,6,....这时候的值是如何取出来的呢?不知道说明白没。
...全文
139 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsaihz 2011-09-06
  • 打赏
  • 举报
回复
记录指针移动到下一条记录,取值自然就变了啊!
lmy0114 2011-09-03
  • 打赏
  • 举报
回复
请高手帮忙
lmy0114 2011-09-02
  • 打赏
  • 举报
回复
发错地了吧哥们
xyl_ztj 2011-09-02
  • 打赏
  • 举报
回复
2ulReadLen换ulWriteLen
if(62 != 41(&pucData[ulTotalWrite], 46CHAR), 62, fp)){
rn 32;}
ulTotalWrite += 62;}


3CHECK;
51 = 44(pcFilePath, "r"); if (CCU_NULL_PTR == 51){
50 "Open file fail");rn 31;}
acVal[23] = '\0';
(VOID)40(acVal, 46CHAR), 23, 51);
*puData = (UINT)47(acVal);42(51);


4CHECK;
, "w");
..{
50 "Open file[%s] for write fail", pcFilePath);
,,}43(acVal, 46acVal), "%d", uData);
63 = (UINT16)45(acVal);
if(63 != 41(acVal, 46CHAR), 63, 51)){
50 "fwite writelen[%d] fail", 63);42(51);
rn 32;}42(51);

5
wLen = *pwOpLen;
43(acStrDir, sizeof(acStrDir), "/sys/bus/i2c/devices/%d-%04x/eeprom", ucI2CChn, wDevAddr);
51 = open(acStrDir, O_RDONLY); if (51 < 0){50, "Open file fail");return 31;}

/*根据地址查找文件位置*/
if(lseek(51, wOffset, SEEK_SET) < 0){
50, "eeprom Offset[%d] error", wOffset);close(fp_val);return CCU_ERR_MPI_FILE_ILLEGAL;}

/*读取指定长度的数据*/
*pwOpLen = (UINT16)read(51, pucData, (UINT)*pwOpLen);

if(0 == *pwOpLen){close(51);return 33;}

if(*pwOpLen != wLen){50, "not all data read, need to read len[%d] len_ret[%d]", wLen, *pwOpLen);close(fp_val);return 33;}
close(51);
6.5
..
..

/*写入指定长度的数据*/
..(UINT16)write(.. *pwOpLen);
if(*pwOpLen != wLen)
..
xyl_ztj 2011-09-02
  • 打赏
  • 举报
回复
CCU_ERR_MPI_INVALID_PARAMS 11
FILE_OPERATE_LEN_ONETIME 22
CCU_ERR_MPI_READFILE_ERROR 33
CCU_ERR_MPI_WRITE_FILE_FAIL 32
CCU_ERR_MPI_OPEN_FILE_FAIL 31
CCU_FRead 40
CCU_FWrite 41
CCU_FClose 42
CCU_Snprintf 43
CCU_FOpen 44
CCU_StrLen 45
sizeof( 46
CCU_AtoI 47
DBG_DRVADP(LP_ERR, 50
fp_val 51

ulReadLen 60
ulBlockNum 61
uTmplen 62
wWriteLen 63


1CHECK;
if(0 == 60){rn 11;}
/*文件分块 按每次写入flash的数据大小将文件分块*/
if(0 == (60 % 22)){
61 = 60 / 22;}
else{61 = 60 / 22 + 1;}
for(i = 0; i < 61; i++){/*是否最后一块数据*/
if(i == (61 - 1)){
if(0 == (60 % 22)){
62 = 22;}
else{62 = 60 % 22;}
}else{62 = 22;}
if(62 != 40(&pucData[ulTotalRead], 46CHAR), 62, fp))
{rn 33;}
ulTotalRead += 62;}
lmy0114 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zsaihz 的回复:]
我觉得不管rs.next()返回的值是true还是false,都会执行next()方法,数据库指针都会向下移动!
[/Quote]

可是这个程序不是按照pid的条件取的值么,这时候的pid=3 程序怎么做到让pid=下个取值的呢
zsaihz 2011-09-02
  • 打赏
  • 举报
回复
我觉得不管rs.next()返回的值是true还是false,都会执行next()方法,数据库指针都会向下移动!
lmy0114 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 carbon107 的回复:]
代码不够,真不太懂,贴之
[/Quote]

也辛苦了你这么半天谢谢了
carbon107 2011-09-02
  • 打赏
  • 举报
回复
代码不够,真不太懂,贴之
lmy0114 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 carbon107 的回复:]
你那个递归,不断连接数据库,取数据。。。
[/Quote]
你这个办法效率是高一些,但是你可能没明白我的问题
数据库的值一个一个取出,我纠结的是当pid取值3时(数据库pid并没有3这个值,但是id有3这个值)程序怎么往下进行 如何取出剩下的(id值为4.5.6.7.8.....)的数据
carbon107 2011-09-02
  • 打赏
  • 举报
回复
你那个递归,不断连接数据库,取数据。。。
lmy0114 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 carbon107 的回复:]
那应该把提出所有数据的SQL执行语句放在函数外边,然后循环while循环

String sql = "select * from article where pid = " + id;
Statement stmt = DB.createStmt(conn);
ResultSet rs = DB.executeQuery(stmt, sql);
try{
while(rs.nex……
[/Quote]

这是一样的吧 当pid的值为3的话while里面的rs.next()依然是false while里的tree方法依然运行不到
这个时候程序是如何取剩下的值的呢
carbon107 2011-09-02
  • 打赏
  • 举报
回复
这样多好啊,一次提出所有数据,然后再递归处理
我嘞个去 2011-09-02
  • 打赏
  • 举报
回复
carbon107 2011-09-02
  • 打赏
  • 举报
回复
那应该把提出所有数据的SQL执行语句放在函数外边,然后循环while循环

String sql = "select * from article where pid = " + id;
Statement stmt = DB.createStmt(conn);
ResultSet rs = DB.executeQuery(stmt, sql);
try{
while(rs.next()){
.......
tree(articles, conn, a.getId(), grade);
}
}

public void tree(List<Article> articles, int id, int grade )
{
if(!a.isIsleaf())
{
.............................//其他处理
tree(articles, a.getId(), grade+1);
}
}
lmy0114 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cai5 的回复:]
慢慢折磨了一下 :

当id = 3时 , rs.next() == false ,结果跳过while循环 ;


关键是 ,你的while里面做什么啊

while(rs.next()){
....... /// ????????????????
if(!a.isIsleaf()){
tree(articles, conn, a.getId(), grade+1);
……
[/Quote]


做了这些
Article a = new Article()
a.setId(rs.getInt("id"));
a.setPid(rs.getInt("pid"));
lmy0114 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 carbon107 的回复:]
你要递归调用,产生树吧?
判断是不是叶子,然后加入到节点中?
[/Quote]
对,但是我不明白 rs.next()返回false了 数据库剩下的值是怎么取到的 就像我刚说的id假如=3时if时再次运行tree方法 pid的值也是3 可是while方法体语句不运行了 剩下的id的值是怎么取到的 id也没有自增
lmy0114 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cai5 的回复:]
但当id值为3的时候 再次运行时pid值为3 可pid值为3时rs.next()返回值为false

没整明白 ,可能我的理解能力有点问题,能不能再详细点
[/Quote]

数据库的id字段值为1.2.3.4.5.6.7... 但是pid字段值为1.2.5.2.6.4.2.5......当id值为3的时候程序到if是再次运行 这时候 sql语句select * from article where pid = 3 可数据库的id字段没有3这个值 运行到rs.next()返回值不就是false while语句返回值为false不就不运行方法体里的程序了么,这样说明白不?
carbon107 2011-09-02
  • 打赏
  • 举报
回复
你要递归调用,产生树吧?
判断是不是叶子,然后加入到节点中?
五哥 2011-09-02
  • 打赏
  • 举报
回复
慢慢折磨了一下 :

当id = 3时 , rs.next() == false ,结果跳过while循环 ;


关键是 ,你的while里面做什么啊

while(rs.next()){
....... /// ????????????????
if(!a.isIsleaf()){
tree(articles, conn, a.getId(), grade+1);
}
加载更多回复(1)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧