|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
缺乏可以共同遵循的行业标准,ASP还处在发展初期,大家对它的理解不同,如产品和服务标准,收费标准等,不利于行业的健康发展。一时表自己在调试以下存储过程当中碰到了很年夜的困扰(次要是一时表操纵):
CREATEPROCEDURE[c_readtop]@eachrowint=10AS
declare@tmpcatvarchar(16)
createtable#tmp_result(aridint,cat2varchar(16),titlevarchar(100),updaydatetime)
declarert_cursorcursor
forselectcat2fromcategorywherecat1=电脑手册andcatl=2
openrt_cursor
fetchfromrt_cursorinto@tmpcat
while@@fetch_status=0
Begin
setrowcount@eachrow
Insertinto#tmp_result(arid,cat2,title,upday)Selecttop10arid,cat2,title,updayfromarticleasa
leftjoincategoryasbona.sortid=b.catidwhereb.cat1=电脑手册andb.cat2=@tmpcatorderbyupdaydesc
fetchfromrt_cursorinto@tmpcat
End
select*from#tmp_result
droptable#tmp_result
closert_cursor
deallocatert_cursor
此存储历程的感化是掏出每一个分类的最新10笔记录。
呈现的毛病信息是(一旦操纵前往的纪录集时就呈现):
ADODB.Recordset毛病800a0e78
Theoperationrequestedbytheapplicationisnotallowediftheobjectisclosed.
此存储历程能在qa中一般运转且能失掉准确了局,利用odbc毗连数据库的话,也能失掉准确的了局。因而起首嫌疑oledb方
式毗连没能前往纪录集。举行了上面的调试:
(一)加调试标志,在挪用纪录集前用setrs=rs.nextrecordset测试是否是射中前往的纪录集……
(二)因为该过存本来是另外一个历程的一部分,嫌疑存储过程当中有些语句不克不及同时利用,因而将该历程分别成一个自力的
存储历程,毛病仍旧。
(三)嫌疑挪用该历程的Asp有成绩,因而重做一个只是挪用该存储历程的Asp程序,毛病仍旧。
(四)将毗连体例改成odbc体例毗连(建dsn,设sqlserver的loginID,设权限),该毛病消散。从头利用oledb毗连,
毛病仍旧。
(五)嫌疑对一时表的数据拔出有成绩,作废往一时表拔出数据,能前往一个空的纪录集。
(六)经Bigeagle提醒,将一时表建在一时数据库tempdb上,毛病仍旧
(七)把存储过程当中的droptable往失落,在qa中运转该存储历程,察看一时表的天生情形,发明一时表准确天生且有准确
的数据拔出,百思不得其解,数据输入到哪了?
(八)经Bigeagle提醒createtable一句前往了纪录集,因而从头在输入纪录集前利用多个setrs=rs.nextrecordset(最
多放上了4个),毛病提醒仍旧。
(九)嫌疑一时表操纵有成绩,将一时表改成流动表,不拔出数据时前往空纪录集,拔出纪录时仍旧提醒毛病。在纪录集
输入前先实行一个或多个setrs=rs.nextrecordset,终究有一次没有提醒堕落(检测到rs.eof为false),因而才恍然年夜
悟――不仅是createtable前往了纪录集,并且连insertinto语句也前往了纪录集,不外该纪录集得一种出格的纪录集
(没有字段,不克不及对该纪录集举行任何操纵――连检测rs.eof都不同意),我在此将它称为特别的纪录集,便利上面引
用。
(十)晓得了成绩的关键,就即刻办理了,在存储过程当中不但愿前往纪录集前实行setnocounton,要前往纪录集时,先
实行setnocountoff。
也就是改成:
CREATEPROCEDURE[c_readtop]@eachrowint=10AS
declare@tmpcatvarchar(16)
setnocounton
createtable#tmp_result(aridint,cat2varchar(16),titlevarchar(100),updaydatetime)
declarert_cursorcursor
forselectcat2fromcategorywherecat1=电脑手册andcatl=2
openrt_cursor
fetchfromrt_cursorinto@tmpcat
while@@fetch_status=0
Begin
setrowcount@eachrow
Insertinto#tmp_result(arid,cat2,title,upday)Selecttop10arid,cat2,title,updayfromarticleasa
leftjoincategoryasbona.sortid=b.catidwhereb.cat1=电脑手册andb.cat2=@tmpcatorderbyupdaydesc
fetchfromrt_cursorinto@tmpcat
End
setnocountoff
select*from#tmp_result
droptable#tmp_result
closert_cursor
deallocatert_cursor
成绩办理。
在该存储历程调试过程当中,发明oledb和odbc存在一个很年夜的不同,asp向odbc取纪录集时,odbc过滤了下面所称的特
殊纪录集(那种只占地位但不克不及举行任何操纵的纪录集――多由createtable或insertinto发生),而asp向oledb取纪录
集时,oledb并未将特别纪录集过滤。
同时,熟悉到在利用存储历程前往纪录集时,在不但愿前往纪录的中央,应当利用setnocounton克制存储历程前往
纪录集,不然大概会绕良多弯路。
终究分明了为何绕了这么多弯路:没有想到oledb前往了这么多特别的纪录集(仍是由一个轮回发生的,该轮回实行
次数5、6次),怪不得在取纪录集前固然实行了setrs=rs.nextrecordset,但终因数据不敷多而未能发明毛病关键地点。
出格感激在调试过程当中bigeagle赐与的提醒,多谢。
</p>源代码保护方面其实现在考虑得没那么多了..NET也可以反编译.ASP写得复杂的话别人能看得懂的话.他也有能力自己写了.这方面担心的倒不太多.纵观现在网上可以下载的那些所谓BBS还有什么网站等等的源代码 |
|