BOF-, EOF- und Bookmark-Eigenschaft (Beispiel) (VC++)

Gilt für: Access 2013, Office 2013

In der ersten Funktion in diesem Beispiel wird mithilfe der Eigenschaften BOF und EOF eine Nachricht angezeigt, falls ein Benutzer versucht, über den ersten oder letzten Datensatz eines Recordset-Objekts hinaus zu navigieren. Mit der Bookmark-Eigenschaft kann der Benutzer einen Datensatz in einem Recordset -Objekt kennzeichnen und später zu diesem zurückkehren.

The second function uses the Bookmark property to place the Bookmark of every other record from a Recordset into an array, and then filters the Recordset using the array.

 
// BeginBOFCpp 
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile") 
 
#include <ole2.h> 
#include <stdio.h> 
#include <conio.h> 
#include "BofEofBookmark.h" 
 
// Function declarations 
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);}; 
void BOFX(void); 
void BookmarkX(void); 
void PrintProviderError(_ConnectionPtr pConnection); 
void PrintComError(_com_error &e); 
 
/////////////////////////////////////////////////////////// 
// // 
// BOFX Function // 
// // 
/////////////////////////////////////////////////////////// 
 
void main() 
{ 
 if(FAILED(::CoInitialize(NULL))) 
 return; 
 
 BOFX(); 
 
 //Clear the screen for the next display 
 system("cls"); 
 
 BookmarkX(); 
 
 printf("Press any key to continue..."); 
 getch(); 
 
 ::CoUninitialize(); 
} 
 
/////////////////////////////////////////////////////////// 
// // 
// BOFX Function // 
// // 
/////////////////////////////////////////////////////////// 
 
void BOFX(void) 
{ 
 // Define ADO object pointers. 
 // Initialize pointers on define. 
 // These are in the ADODB:: namespace 
 _RecordsetPtr rstPublishers = NULL; 
 
 //Define Other Variables 
 HRESULT hr = S_OK; 
 IADORecordBinding *picRs = NULL; //Interface Pointer declared. 
 CPublishers Publs; 
 
 bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';" 
 "Initial Catalog='pubs';Integrated Security='SSPI';"); 
 _bstr_t strMessage; 
 _variant_t VarBookmark; 
 int intCommand = 0; 
 _variant_t TempPublisher; 
 
 try 
 { 
 // Open recordset with data from Publishers table. 
 TESTHR(rstPublishers.CreateInstance(__uuidof(Recordset))); 
 rstPublishers->CursorType = adOpenStatic; 
 
 // Use client cursor to enable absolutePosition property. 
 rstPublishers->CursorLocation = adUseClient; 
 rstPublishers->Open("select pub_id, pub_name from publishers" 
 " order by pub_name", strCnn, adOpenStatic, 
 adLockBatchOptimistic, adCmdText); 
 
 //Open an IADORecordBinding interface pointer 
 //which will be used for Binding Recordset to a class 
 TESTHR(rstPublishers->QueryInterface( 
 __uuidof(IADORecordBinding), (LPVOID*)&picRs)); 
 
 //Bind the Recordset to a C++ Class here 
 TESTHR(picRs->BindToRecordset(&Publs)); 
 
 rstPublishers->MoveFirst(); 
 
 while (true) // Continuous loop. 
 { 
 // Display information about the current record 
 // and get user input 
 printf("Publisher:%s \n Record %d of %d\n\n", 
 Publs.lP_pubnameStatus == adFldOK ? 
 Publs.m_szP_pubname : "<NULL>", 
 rstPublishers->AbsolutePosition, 
 rstPublishers->RecordCount); 
 printf("Enter command:\n "); 
 printf("[1 - next / 2 - previous /\n"); 
 printf(" 3 - set bookmark / 4 - go to bookmark /\n"); 
 printf(" 5 - quit ]\n"); 
 
 scanf("%d", &intCommand); 
 if ((intCommand < 1) || (intCommand > 4)) 
 break; // Out of range entry exits program loop. 
 
 switch(intCommand) 
 { 
 // Move forward or backward, trapping for BOF or EOF 
 case 1: 
 rstPublishers->MoveNext(); 
 if (rstPublishers->EndOfFile) 
 { 
 printf("\nCannot move past the last record." 
 " Try again...\n"); 
 rstPublishers->MoveLast(); 
 } 
 break; 
 
 case 2: 
 rstPublishers->MovePrevious(); 
 if (rstPublishers->BOF) 
 { 
 printf("\nCannot move before the first record." 
 " Try again...\n"); 
 rstPublishers->MoveFirst(); 
 } 
 break; 
 
 // store the bookmark of the current record. 
 case 3: 
 VarBookmark = rstPublishers->Bookmark; 
 // Go to the record indicated by the 
 // stored bookmark 
 break; 
 
 case 4: 
 // Check for whether bookmark set for a record 
 if (VarBookmark.vt == VT_EMPTY) 
 printf("No Bookmark set!\n"); 
 else 
 rstPublishers->Bookmark = VarBookmark; 
 break; 
 
 default: 
 break; 
 } 
 } 
 } 
 catch (_com_error &e) 
 { 
 printf("Error in BOFx...\n"); 
 // Notify the user of errors if any. 
 _variant_t vtConnect = rstPublishers->GetActiveConnection(); 
 
 // GetActiveConnection returns connect string if connection 
 // is not open, else returns Connection object. 
 switch(vtConnect.vt) 
 { 
 case VT_BSTR: 
 printf("Error:\n"); 
 printf("Code = %08lx\n", e.Error()); 
 printf("Message = %s\n", e.ErrorMessage()); 
 printf("Source = %s\n", (LPCSTR) e.Source()); 
 printf("Description = %s\n", (LPCSTR) e.Description()); 
 break; 
 case VT_DISPATCH: 
 PrintProviderError(vtConnect); 
 break; 
 default: 
 printf("Errors occured."); 
 break; 
 } 
 printf("Press any key to continue..."); 
 getch(); 
 } 
 
 
 // Clean up objects before exit. 
 //Release the IADORecordset Interface here 
 if (picRs) 
 picRs->Release(); 
 
 if (rstPublishers) 
 if (rstPublishers->State == adStateOpen) 
 rstPublishers->Close(); 
} 
 
/////////////////////////////////////////////////////////// 
// // 
// BookmarkX Function // 
// // 
/////////////////////////////////////////////////////////// 
 
void BookmarkX(void) 
{ 
 // Define ADO object pointers. 
 // Initialize pointers on define. 
 // These are in the ADODB:: namespace. 
 _RecordsetPtr rstAuthors = NULL; 
 
 //Define Other Variables 
 IADORecordBinding *picRs = NULL; //Interface Pointer declared. 
 CAuthors Authrs; 
 HRESULT hr = S_OK; 
 _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';" 
 "Initial Catalog='pubs';Integrated Security='SSPI';"); 
 _variant_t vBookmark; 
 
 // Variable declaration for safe arrays. 
 SAFEARRAY FAR* psa; 
 
 // define ARRAY/ VARIANT variant. 
 vBookmark.vt = VT_ARRAY|VT_VARIANT; 
 SAFEARRAYBOUND rgsabound[1]; 
 rgsabound[0].lLbound = 0; 
 rgsabound[0].cElements = 11; 
 long ii = 0; 
 
 try 
 { 
 rstAuthors.CreateInstance(__uuidof(Recordset)); 
 // Set The Cursor Location 
 rstAuthors->CursorLocation = adUseClient; 
 rstAuthors->PutActiveConnection((_variant_t)strCnn); 
 
 // Open Authors table 
 TESTHR(rstAuthors->Open("select * from authors",strCnn, 
 adOpenStatic,adLockBatchOptimistic,adCmdText)); 
 
 //Open an IADORecordBinding interface pointer 
 //which we'll use for binding Recordset to a class 
 TESTHR(rstAuthors->QueryInterface(__uuidof(IADORecordBinding), 
 (LPVOID*)&picRs)); 
 
 //Bind the Recordset to a C++ Class here 
 TESTHR(picRs->BindToRecordset(&Authrs)); 
 
 printf("Number of Records before filtering: %d\n", 
 rstAuthors->RecordCount); 
 
 // Create safearrays to store array of variant 
 psa = SafeArrayCreate(VT_VARIANT,1,rgsabound); 
 
 // Store bookmark of every other record into an array. 
 while ((!rstAuthors->EndOfFile) && (ii < 11)) 
 { 
 SafeArrayPutElement(psa,&ii,&rstAuthors->Bookmark); 
 //ii = ii +1; 
 ii++; 
 rstAuthors->Move(2); 
 } 
 
 vBookmark.parray = psa; 
 
 // Filter the Record with the array of bookmarks. 
 rstAuthors->put_Filter(vBookmark); 
 printf("Number of Records after filtering: %d\n", 
 rstAuthors->RecordCount); 
 rstAuthors->MoveFirst(); 
 
 while (!rstAuthors->EndOfFile) 
 { 
 printf("%d %s\n",rstAuthors->AbsolutePosition, 
 Authrs.lau_lnameStatus == adFldOK ? 
 Authrs.m_szau_lname : "<NULL>"); 
 rstAuthors->MoveNext(); 
 } 
 } 
 catch (_com_error &e) 
 { 
 // Notify the user of errors if any. 
 _variant_t vtConnect = rstAuthors->GetActiveConnection(); 
 
 // GetActiveConnection returns connect string if connection 
 // is not open, else returns Connection object. 
 switch(vtConnect.vt) 
 { 
 case VT_BSTR: 
 printf("Error:\n"); 
 printf("Code = %08lx\n", e.Error()); 
 printf("Message = %s\n", e.ErrorMessage()); 
 printf("Source = %s\n", (LPCSTR) e.Source()); 
 printf("Description = %s\n", (LPCSTR) e.Description()); 
 break; 
 case VT_DISPATCH: 
 PrintProviderError(vtConnect); 
 break; 
 default: 
 printf("Errors occured."); 
 break; 
 } 
 } 
 
 // Clean up objects before exit. 
 //Release the IADORecordset Interface here 
 if (picRs) 
 picRs->Release(); 
 
 if (rstAuthors) 
 if (rstAuthors->State == adStateOpen) 
 rstAuthors->Close(); 
} 
 
/////////////////////////////////////////////////////////// 
// // 
// PrintProviderError Function // 
// // 
/////////////////////////////////////////////////////////// 
 
void PrintProviderError(_ConnectionPtr pConnection) 
{ 
 // Print Provider Errors from Connection object. 
 // pErr is a record object in the Connection's Error collection. 
 ErrorPtr pErr = NULL; 
 long nCount = 0; 
 long i = 0; 
 
 if( (pConnection->Errors->Count) > 0) 
 { 
 nCount = pConnection->Errors->Count; 
 // Collection ranges from 0 to nCount -1. 
 for(i = 0; i < nCount; i++) 
 { 
 pErr = pConnection->Errors->GetItem(i); 
 printf("Error number: %x\t%s\n", pErr->Number, 
 (LPCSTR) pErr->Description); 
 } 
 } 
} 
// EndBOFCpp 

BofEofBookmark.h

 
// BeginBOFEOFH 
#include "icrsint.h" 
 
//This Class extracts only pubid,lastname and hire_date 
class CPublishers : public CADORecordBinding 
{ 
BEGIN_ADO_BINDING(CPublishers) 
 
 //Column title is the 2nd field in the recordset 
 ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szP_pubid, 
 sizeof(m_szP_pubid), lP_pubidStatus, FALSE) 
 
 //Column type is the 3rd field in the recordset 
 ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szP_pubname, 
 sizeof(m_szP_pubname), lP_pubnameStatus, TRUE) 
 
END_ADO_BINDING() 
 
public: 
 CHAR m_szP_pubid; 
 ULONG lP_pubidStatus; 
 CHAR m_szP_pubname[40]; 
 ULONG lP_pubnameStatus; 
}; 
 
//This Class extracts only authorlastname 
 
class CAuthors : public CADORecordBinding 
{ 
BEGIN_ADO_BINDING(CAuthors) 
 
 //Column authorlname is the 2nd field in the recordset 
 ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname, 
 sizeof(m_szau_lname), lau_lnameStatus, FALSE) 
 
END_ADO_BINDING() 
 
public: 
 CHAR m_szau_lname[40]; 
 ULONG lau_lnameStatus; 
}; 
// EndBOFEOFH