儲存過程不返回記錄集導致ADO程式出錯

2022-05-15 17:07:01 字數 1012 閱讀 6918

hresult _hr = get_adoeof(&_result);

iseof()函式如下:其中adocg::_recordsetptr m_precordset;

bool iseof()       ;

m_precordset->adoeof 將執行下面的函式(見msado15。tli)

1    inline variant_bool recordset15::getadoeof ( )

程式將在上述第三行**處丟擲異常。

經過查詢網上的資料以及和同事一起研究發現。在儲存過程中沒有返回記錄集的路徑中增加乙個select top 0 0 創造乙個空記錄集返回也可避免該異常的發生。所以,儲存過程中沒有返回記錄集是導致該問題的根本原因。

還有一種避免(僅僅是避免)該異常的方法是在執行完儲存過程後,先使用如下**來判斷記錄集是否已經開啟

if (m_precordset->getstate() == adocg::adstateclosed)

return  false;

else

return  true;

如果記錄集未開啟,則直接通知上傳呼叫模組不要再做記錄集操作。

最後小結下該問題的處理方法。

1.程式呼叫儲存過程時,是否返回記錄集時由儲存過程本身決定的。一般的我們首先使用set nocount on 來關閉計數,防止干擾我們通過select語句返回我們期望的記錄集。

2.從儲存過程本身下手。保證設計為返回記錄集的儲存過程,必須在任何時候都有查詢語句返回記錄集。即使查詢條件不符合也要返回乙個空記錄集。以保證儲存過程的健壯性。

3.修改ado封裝類的函式:bool cadorecordset::open(lpctstr lpstrexec)

在執行儲存過程並返回記錄集後,先檢查記錄集是否開啟。如果未開啟,則返回false,通知上層程式,開啟記錄集出錯。 應該進行相應的錯誤處理而不是繼續操作記錄集。

儲存過程不返回記錄集導致ado程式出錯的分析 - nscboy的專欄 - csdn部落格

Oracle儲存過程返回記錄集

oracle的儲存過程返回記錄集,關鍵之處是要用游標。關於資料庫的游標 cursor 大家肯定都接觸不少,我們可以通過open,fetch,close操作控制游標進行各種方便的操作,這方面的例子我就不在重複了。我們現在要介紹的是游標變數 cursor variable 類似游標,游標變數也是指向乙個...

oracle的儲存過程返回記錄集

oracle的儲存過程返回記錄集 oracle的儲存過程返回記錄集,關鍵之處是要用游標。關於資料庫的游標 cursor 大家肯定都接觸不少,我們可以通過open,fetch,close操作控制游標進行各種方便的操作,這方面的例子我就不在重複了。我們現在要介紹的是游標變數 cursor variabl...

儲存過程返回記錄集總數,及輸出。

在查詢分析器中執行建立儲存過程 create procedure recordcount strwhere nvarchar 500 count int output as declare sqlstr nvarchar 1000 if strwhere set sqlstr n select co...