當前位置:才華齋>設計>網頁設計>

ADO程式設計常見問題及解決辦法

網頁設計 閱讀(3.21W)

(一)使用ADO程式設計判斷一個表是否存在

ADO程式設計常見問題及解決辦法

(1)、同樣判斷一個表是否存在,也可以用是否成功地開啟它來判斷,十分方便,例如: try{ m_pRecordset->Open(_variant_t("mytable"), _variant_t((IDispatch *)m_pConnection,true), adOpenKeyset, adLockOptimistic, adCmdTable); } catch (_com_error &e) { ::MessageBox(NULL,"該表不存在。","提示",MB_OK │ MB_ICONWARNING); } (2)、要不然可以採用麻煩一點的辦法,就是在MS-SQL服務器上的每個資料庫中都有一個名為sysobjects的表,檢視此表的內容即知指定的表是否在該資料庫中。 (3)、同樣,每個資料庫中都有一個名為TABLES的檢視(View),檢視此檢視的內容即知指定的表是否在該資料庫中。

(二)ADO程式設計使用AppendChunk的問題

當用AddNew方法剛剛向記錄集內新增一個新記錄之後,不能首先向一個長資料欄位(image型別)寫入資料,必須先向其他欄位寫入過資料之後,才能呼叫AppendChunk寫該欄位,否則出錯。也就是說,AppendChunk不能緊接在AddNew之後。另外,寫入其他欄位後還必須緊接著呼叫AppendChunk,而不能呼叫記錄集的Update方法後,才呼叫AppendChunk,否則呼叫AppendChunk時也會出錯。換句話說,就是必須AppendChunk在前,Update在後。因而這個時候就不能使用帶引數的AddNew了,因為帶引數的AddNew會自動呼叫記錄集的Update,所以AppendChunk就跑到Update的後面了,就只有出錯了!因此,這時應該用不帶引數的AddNew。我推測這可能是MS SQL 7.0的問題,在MS SQL 2000中則不存在這些問題,但是AppendChunk仍然不能在Update之後。

(三)使用ADO程式設計繫結字串型欄位問題

如果要繫結的欄位是字串型別,則對應的`字元陣列的元素個數一定要比欄位長度大2(比如m_szau_fname[22],其繫結的欄位au_fname的長度實際是20),不這樣繫結就會失敗。

(四)使用ADO程式設計重複使用命令物件問題

一個命令物件如果要重複使用多次(尤其是帶引數的命令),則在第一次執行之前,應將它的Prepared屬性設定為TRUE。這樣會使第一次執行減慢,但卻可以使以後的執行全部加快。

(五)使用ADO程式設計SafeArray問題

在初學使用中,我曾遇到一個傷腦筋的問題,一定要注意: 在定義了SAFEARRAY的指標後,如果打算重複使用多次,則在中間可以呼叫::SafeArrayDestroyData釋放資料,但決不能呼叫::SafeArrayDestroyDescriptor,否則必然出錯,即使呼叫SafeArrayCreate也不行。例如: SAFEARRAY *psa; ...... //When the data are no longer to be used: ::SafeArrayDestroyData( psa); 我分析在定義psa指標時,一個SAFEARRAY的例項(也就是SAFEARRAY描述符)也同時被自動建立了。但是隻要一呼叫::SafeArrayDestroyDescriptor,描述符就被銷燬了。 所以我認為::SafeArrayDestroyDescriptor可以根本就不呼叫,即使呼叫也必須在最後呼叫。

(六)ADO程式設計開啟記錄集時的問題

在開啟記錄集時,在呼叫Recordset的Open方法時,其最後一個引數裡一定不能包含adAsyncExecute,否則將因為是非同步操作,在讀取資料時無法讀到資料。