Article ID: 132398
Article Last Modified on 11/21/2006
.
.
.
CDatabase db;
db.Open("MYDataSourceName",NULL,NULL,"ODBC;",FALSE);
CCounterSet rs(&db);
// Open up dynaset because any records added by a CRecordset using
// dynasets are appended to the end of the recordset using
// the Microsoft Access 2.0 driver
rs.Open(CRecordset::dynaset);
// move to some record
rs.MoveNext();
BOOKMARK bookmark;
rs.GetBookmark(&bookmark);
// Add record. Counter field of record is given a value by
// the ODBC driver
rs.AddNew();
rs.m_textfield="SomeText";
rs.Update();
// MoveLast to get on record just added
rs.MoveLast();
// retrieve the value of the counter field for the
// newly added record here
// return to the record you were on
rs.MoveToBookmark(bookmark);
.
.
.
// This code was tested with the MFC ODBC database classes
// included with Visual C++ versions 2.1, 2.2 and 4.0, and the Microsoft
// Access version 2.0 ODBC driver, which supports bookmarks.
static const char szRowFetch[] = "State:01S01";
static const char szDataTruncated[] = "State:01004";
void CMyRecordset::OnSetOptions(HSTMT hstmt)
{
RETCODE nRetCode;
AFX_SQL_SYNC(::SQLSetStmtOption(hstmt, SQL_USE_BOOKMARKS, SQL_UB_ON));
if (!Check(nRetCode))
{
TRACE("Error setting bookmark use\n");
ThrowDBException(nRetCode);
}
CRecordset::OnSetOptions(hstmt);
}
void CMyRecordset::GetBookmark(BOOKMARK * lpBookmark)
{
ASSERT(IsOpen());
// Can't save bookmark if not on valid record
ASSERT(!IsBOF() && !IsEOF() && !IsDeleted());
RETCODE nRetCode;
AFX_SQL_SYNC(::SQLGetStmtOption(m_hstmt, SQL_GET_BOOKMARK,
(PTR)lpBookmark));
if (!Check(nRetCode))
{
TRACE("GetBookmark error: A forward-only cursor may be"
"causing the error\n");
ThrowDBException(nRetCode);
}
}
void CMyRecordset::MoveToBookmark(BOOKMARK lBookmark)
{
ASSERT(IsOpen());
if (m_nFieldsBound > 0)
{
// Reset field flags - mark all clean, all non-null
memset(m_pbFieldFlags, 0, m_nFields);
}
// Clear any edit mode that was set
ReleaseCopyBuffer();
RETCODE nRetCode;
DWORD dwRowsMoved;
AFX_SQL_ASYNC(this, ::SQLExtendedFetch(m_hstmt,
SQL_FETCH_BOOKMARK, (SDWORD)lBookmark,
&dwRowsMoved, &m_wRowStatus));
if (nRetCode == SQL_SUCCESS_WITH_INFO)
{
CDBException e(nRetCode);
// Build the error string but don't send nuisance output to
// TRACE window
e.BuildErrorString(m_pDatabase, m_hstmt, FALSE);
if (e.m_strStateNativeOrigin.Find(szDataTruncated) >= 0)
{
// Ignore data truncated warning if binding long binary
// columns (may mask non-long binary truncation warnings
// or other warnings)
if (m_bUseUpdateSQL || !m_bLongBinaryColumns ||
!m_bUpdatable)
{
e.Empty();
TRACE0("Error: field data truncated during Open or"
" Requery.\n");
ThrowDBException(AFX_SQL_ERROR_DATA_TRUNCATED);
}
}
else if (e.m_strStateNativeOrigin.Find(szRowFetch) >= 0)
{
e.Empty();
TRACE0("Error: fetching row from server during Open or"
" Requery.\n");
ThrowDBException(AFX_SQL_ERROR_ROW_FETCH);
}
}
else
{
if (!Check(nRetCode))
{
TRACE0("Error: Move operation failed.\n");
ThrowDBException(nRetCode);
}
}
Fixups();
m_bBOF = FALSE;
m_bEOF = FALSE;
}
Additional query words: 2.00 1.50 1.51
Keywords: kbcode kbdatabase kbhowto kbprogramming KB132398