以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 Java/Eclipse 』  (http://bbs.xml.org.cn/list.asp?boardid=41)
----  求助jsp读写查询数据库的办法  (http://bbs.xml.org.cn/dispbbs.asp?boardid=41&rootid=&id=33439)


--  作者:xiongbajian
--  发布时间:5/31/2006 7:20:00 PM

--  求助jsp读写查询数据库的办法
我最近在学习jsp,jsp读取数据库的知识我只知道一些大路边上的,甚至多数是网上的一些源代码被我照葫芦画瓢给拿来用了。这样的结果就是有时候很难优化程序,因为我只虽然用那些方法,但是细节的东西我不知道。于是,当操作简单的时候程序速度还行,而遇到一些比较麻烦的操作的时候,就明显感觉速度慢了。今天发贴问一个jsp读取数据库记录中所以值的问题,希望得到一个好一些的办法。

    
    下面是我常用的一种查询数据库中记录值的方法,其中为了让你看的方便,让我删除了一些代码:

for(i=1;i<=50;i++){
 
      String xinxilie = "xinxi" + String.valueOf(i);
      ResultSet rsYhXinxi2 = yonghuDBConn.executeQuery("select * from xinxi where yonghuming ='abc'");
        if(yonghuDBConn.rs_next()){
             xinxiShuzu[i] = rsYhXinxi2.getString(xinxilie);
          }

}

    像上面似的,我都是每循环一次就查询一次数据库,然后提取那可怜的一个值存到数组当中。这样做的缺点很明显,就是每循环一次,都要查询一次数据库,循环50次,则查询50次。速度慢的和蜗牛一样。于是我该成了下面的样子。

ResultSet rsYhXinxi2 = yonghuDBConn.executeQuery("select * from xinxi where yonghuming ='abc'");

   if(yonghuDBConn.rs_next()){
         for(i=1;i<=50;i++){
             String xinxilie = "xinxi" + String.valueOf(i);
             xinxiShuzu[i] = rsYhXinxi2.getString(xinxilie);
     }
}


改成这样,执行时候却提示说“java.sql.SQLException:[Microsoft][ODBC SQL Server Driver]无效的描述父索引”。我不知道是什么原因,只知道程序在 i=1 时候执行没有问题,但是到了 i=2 时候就不行了,我也不知道无效的描述符索引是什么意思。

因此还请各位高手指点迷津,最好告诉我这个“java.sql.SQLException:[Microsoft][ODBC SQL Server Driver]无效的描述父索引”是怎么回事,是由于那些问题造成的,这样我就可以把我的程序改成先查询在循环了。

当然,如果还有其他的方法,可以只查询一次就能完成上面的任务,那么也很好,还请不吝赐教。谢谢各位了,^_^


--  作者:binaryluo
--  发布时间:6/1/2006 8:49:00 AM

--  
1.满足查询条件的结果是被保存在ResultSet对象中的,用循环的方法将记录一条一条的从ResultSet对象中读出来是唯一的方法。至于你说的"循环50次,则查询50次。速度慢的和蜗牛一样",怕没有那么夸张,就算你在一个jsp页面里直接循环50次读出50条记录,从点了查询按钮到得到结果显示,你也只会感到那点时延是由于网络时延引起的。

2.发生“java.sql.SQLException:[Microsoft][ODBC SQL Server Driver]无效的描述父索引”错误,是因为你的“if(yonghuDBConn.rs_next()){”是错的,应该改为“rsYhXinxi2.rs_next()”。

3.如果想提高数据库访问的效率,可以考虑使用存储过程来执行数据库操作,而不是直接写sql语句。


--  作者:xiongbajian
--  发布时间:6/2/2006 6:04:00 PM

--  
谢谢版主的指点,学到了很多。不过我现在发现出现那个错误的原因可能是循环查询的时候顺序打乱造成的。因为我在数据库中放了50条xinxi列,分别是xinxi1,xinxi2,……,然后又有50条yonghu列,分别为yonghu1,yonghu2,……。
每次查询的时候,总是同时查询xinxiN和yonghuN,这样到第二循环就错了,因为xinxi2在yonghu1的前面,于是我把数据库的结构改成了xinxi1,yonghu1,xinxi2,yonghu2,……的形式,然后再用先查询,再循环读取的方式,竟然通过了。

不知道我说的对不对,因为我对数据库的掌握都是用到的时候才去查找使用的方法,从来没有系统的仔细学过,因此总结出来的东西也多是根据经验,因此不对的地方也在所难免。如果说的不对,还请各位指正。

再次感谢版主的指点,真的学到了很多。


--  作者:binaryluo
--  发布时间:6/3/2006 9:13:00 AM

--  
ResultSet rsYhXinxi2 = yonghuDBConn.executeQuery("select * from xinxi where yonghuming ='abc'");

从这句中看出:
yonghuDBConn是Statement对象,rsYhXinxi2是ResultSet对象。
而next()方法是在ResultSet中的,所以要用rsYhXinxi2对象来引用。

我昨天把rs_next()方法看成是ResultSet中的next()方法了。

在你的第一个代码片断中把查询放在循环中是不行的,逻辑上也不对,那样写相当于是同一个查询结果你查询了50次,应该把查询放在循环外面来做。然后用循环来处理查询的结果集——ResultSet。
通常处理方法是:

String xinxilie = "xinxi" + String.valueOf(i);
ResultSet rsYhXinxi2 = yonghuDBConn.executeQuery("select * from xinxi where yonghuming ='abc'");
while(rsYhXinxi2.next()){
       xinxiShuzu[i] = rsYhXinxi2.getString(xinxilie);
}


处理查询结果集一般用rsYhXinxi2的next()方法(Statement中的rs_next()方法我是第一次见)。而且最好把这段放到try_catch块中,不然编译可能会报错。


--  作者:xiongbajian
--  发布时间:6/3/2006 4:12:00 PM

--  
很惭愧,其实rs_next()方法,我也不知道,我只是在网上见到了一个源代码,觉得不错,就拿来用了。由于我不是计算机专业,因此学习这些东西也往往是用到什么找什么,从来都是不求甚解。数据库这样,jsp这样,xml也这样。真的很惭愧,但是又觉得只能这样了,什么都学的很精通,感觉真的好困难。
谢谢版主的指导,也向曾经指导过我的所有的网上的,网下的朋友表示感谢。
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms