如这段:
Dim OraDatabase,OraDynaset,sql set OraDatabase = OraSession.getDatabaseFromPool(10)
sql="select...from ...where aaaa=:xx" OraDatabase.Parameters.Add "xx", "haha", ORAPARM_INPUT, ORATYPE_VARCHAR2
Set OraDynaset = OraDatabase.DbCreateDynaset(sql, ORADYN_DEFAULT) ................
如果只运行一次的话,不会出问题。
但是,这是不可能的,哪个页面都可能执行多次。
所以问题出现了……
-------------------------------------------- 由于使用了Session池,你取到的可能还是上次那个OraDatabase对象(或者是别人用的对象),
你Add一次之后,它的Parameters集合中就一直都有…………
所以,你再Add,就会报“参数重复”、“Duplicate parameter name”这个错误。 -------------------------------------------- 首先想到的就是用完就Remove掉,后来一想,如果半路出个错,没Remove掉,下次还是出错。
所以就想到,用之前遍历全部Remove掉。 --------------------------------------------- OraDatabase.Parameters.Remove xx 这个xx可以是下标,0到OraDatabase.Parameters.Count-1,也可以是Name。
开始用Name,太麻烦,换个页面就得重写一边,
想到用下标的方法。 ---------------------------------------------- 开始这样写:
For i=0 To OraDatabase.Parameters.Count-1 OraDatabase.Parameters.Remove i Next
感觉没啥错…………
可是,实际跑起来,感觉里面的参数没有Remove干净……
还以为下标范围不对,For i=0 To OraDatabase.Parameters.Count+1都不行……
郁闷。 ----------------------------------------------- Google之,有老外这样写:
For i=0 To OraDatabase.Parameters.Count-1 OraDatabase.Parameters.Remove 0 Next
注意,那是个0哦……
开始还纳闷……干嘛写个0???
真是猪头脑袋!!(说我自己呢) ----------------------------------------------- 注意,Remove的时候,OraDatabase.Parameters.Count这个值一直在减小……
所以,造成了提早结束循环,这种循环,适合倒过来写。
For i=OraDatabase.Parameters.Count-1 To 0 Step -1 OraDatabase.Parameters.Remove i Next
================================================ 所以,正确方法就是上面这个,和上上面那个。
|