在ASP暫存資料表操作的一些見解

來源:互聯網
上載者:User
暫存資料表 本人在調試以下預存程序中遇到了很大的困擾(主要是暫存資料表操作):

CREATE PROCEDURE [c_readtop] @eachrow int=10 AS
declare @tmpcat varchar(16)
create table #tmp_result (arid int,cat2 varchar(16),title varchar(100),upday datetime)
declare rt_cursor cursor
for select cat2 from category where cat1='電腦手冊' and catl=2
open rt_cursor
fetch from rt_cursor into @tmpcat
while @@fetch_status=0
Begin
set rowcount @eachrow
Insert into #tmp_result (arid,cat2,title,upday) Select top 10 arid,cat2,title,upday from article as a
left join category as b on a.sortid=b.catid where b.cat1='電腦手冊' and b.cat2=@tmpcat order by upday desc
fetch from rt_cursor into @tmpcat
End
select * from #tmp_result
drop table #tmp_result
close rt_cursor
deallocate rt_cursor

此預存程序的作用是取出每個分類的最新10條記錄。
出現的錯誤資訊是(一旦操作返回的記錄集時就出現):
ADODB.Recordset 錯誤 '800a0e78'

The operation requested by the application is not allowed if the object is closed.

此預存程序能在qa中正常運行且能得到正確結果,使用odbc串連資料庫的話,也能得到正確的結果。於是首先懷疑oledb方
式串連沒能返回記錄集。進行了下面的調試:
(一)加調試標記,在調用記錄集前用set rs=rs.nextrecordset測試是不是命中返回的記錄集……
(二)由於該過存原來是另一個過程的一部分,懷疑預存程序中有些語句不能同時使用,於是將該過程分離成一個獨立的
預存程序,錯誤依舊。
(三)懷疑調用該過程的Asp有問題,於是重做一個只是調用該預存程序的Asp程式,錯誤依舊。
(四)將串連方式改為odbc方式串連(建dsn,設sql server的login ID,設許可權),該錯誤消失。重新使用oledb串連,
錯誤依舊。
(五)懷疑對暫存資料表的資料插入有問題,取消去暫存資料表插入資料,能返回一個空的記錄集。
(六)經Bigeagle提示,將暫存資料表建在臨時資料庫tempdb上,錯誤依舊
(七)把預存程序中的drop table去掉,在qa中運行該預存程序,觀察暫存資料表的產生情況,發現暫存資料表正確產生且有正確
的資料插入,百思不得其解,資料輸出到哪了?
(八)經Bigeagle提示create table一句返回了記錄集,於是重新在輸出記錄集前使用多個set rs=rs.nextrecordset(最
多放上了4個),錯誤提示依舊。
(九)懷疑暫存資料表操作有問題,將暫存資料表改為固定表,不插入資料時返回空記錄集,插入記錄時仍然提示錯誤。在記錄集
輸出前先執行一個或多個set rs=rs.nextrecordset,終於有一次沒有提示出錯(檢測到rs.eof為false),於是才恍然大
悟——不但是create table返回了記錄集,而且連insert into語句也返回了記錄集,不過該記錄集得一種特別的記錄集
(沒有欄位,不能對該記錄集進行任何操作——連檢測rs.eof都不允許),我在此將它稱為特殊的記錄集,方便下面引
用。
(十)知道了問題的癥結,就馬上解決了,在預存程序中不希望返回記錄集前執行set nocount on,要返回記錄集時,先
執行set nocount off。

也就是改成:

CREATE PROCEDURE [c_readtop] @eachrow int=10 AS
declare @tmpcat varchar(16)
set nocount on
create table #tmp_result (arid int,cat2 varchar(16),title varchar(100),upday datetime)
declare rt_cursor cursor
for select cat2 from category where cat1='電腦手冊' and catl=2
open rt_cursor
fetch from rt_cursor into @tmpcat
while @@fetch_status=0
Begin
set rowcount @eachrow
Insert into #tmp_result (arid,cat2,title,upday) Select top 10 arid,cat2,title,upday from article as a
left join category as b on a.sortid=b.catid where b.cat1='電腦手冊' and b.cat2=@tmpcat order by upday desc
fetch from rt_cursor into @tmpcat
End
set nocount off
select * from #tmp_result
drop table #tmp_result
close rt_cursor
deallocate rt_cursor

問題解決。


在該預存程序調試過程中,發現oledb和odbc存在一個很大的差別,asp向odbc取記錄集時,odbc過濾了上面所稱的特
殊記錄集(那種只佔位置但不能進行任何操作的記錄集——多由create table或insert into產生),而asp向oledb取記錄
集時,oledb並沒有將特殊記錄集過濾。
同時,認識到在使用預存程序返回記錄集時,在不希望返回記錄的地方,應該使用set nocount on禁止預存程序返回
記錄集,否則可能會繞很多彎路。
終於明白了為什麼繞了這麼多彎路:沒有想到oledb返回了這麼多特殊的記錄集(還是由一個迴圈產生的,該迴圈執行
次數5、6次),怪不得在取記錄集前雖然執行了set rs=rs.nextrecordset,但終因資料不夠多而未能發現錯誤癥結所在。
特別感謝在調試過程中bigeagle給予的提示,多謝。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。