在VC2010下使用資料記錄集修改資料表出現系統崩潰問題的解決(m_pSet->AddNew()等函式)

蓬2018發表於2018-12-04

VC6.0用m_pSet->AddNew()是好好的,在VS2012卻出現系統崩潰,彈出來:

在除錯視窗中提示:

Warning: Driver does not support requested concurrency.
Warning: Setting recordset read only.
Debug Assertion Failed!

Program: D:\MFCDemos\í?è′VS2012°?\StudSco1\.\Debug\StudSco.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dbcore.cpp
Line: 64

其中關鍵的一行資訊:“記錄集為只讀”。

造成這一問題的原因在於開啟資料記錄集的方式,在VC6.0中可以直接選擇預設方式,即:

m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)

但在VS2010以上版本中(筆者使用的是VS2012,其他版本未測試),應該將預設方式改為動態記錄集方式,即:

m_pSet->Open(CRecordset::dynaset,strSQL)

究其根源,在於CRecordset的Open函式的用法根據引數的不同有不同的結果,具體用法參看下文

CRecordset::Open
virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none );
throw( CDBException, CMemoryException );

Return Value

Nonzero if the CRecordset object was successfully opened; otherwise 0 if CDatabase::Open (if called) returns 0.

Parameters

nOpenType

Accept the default value, AFX_DB_USE_DEFAULT_TYPE, or use one of the following values from the enum OpenType: 

CRecordset::dynaset   A recordset with bi-directional scrolling. The membership and ordering of the records are determined when the recordset is opened, but changes made by other users to the data values are visible following a fetch operation. Dynasets are also known as keyset-driven recordsets.


CRecordset::snapshot   A static recordset with bi-directional scrolling. The membership and ordering of the records are determined when the recordset is opened; the data values are determined when the records are fetched. Changes made by other users are not visible until the recordset is closed and then reopened.


CRecordset::dynamic   A recordset with bi-directional scrolling. Changes made by other users to the membership, ordering, and data values are visible following a fetch operation. Note that many ODBC drivers do not support this type of recordset.


CRecordset::forwardOnly   A read-only recordset with only forward scrolling.
For CRecordset, the default value is CRecordset::snapshot. The default-value mechanism allows the Visual C++ wizards to interact with both ODBC CRecordset and DAO CDaoRecordset, which have different defaults.

For more information about these recordset types, see the articleRecordset (ODBC) in Visual C++ Programmer’s Guide. For related information, see the article ”Using Block and Scrollable Cursors" in the ODBC SDK Programmer's Reference.

Caution   If the requested type is not supported, the framework throws an exception.

相關文章