Filter 和 RecordCount 属性示例 (VC++)
适用于:Access 2013、Office 2013
本示例使用 Filter 属性根据应用于现有 Recordset 的指定条件打开一个新的 Recordset。 使用 RecordCount 属性来显示两个 Recordset 中的记录数。 运行此过程需要使用 FilterField 函数。
// BeginFilterCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include "FilterX.h"
// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void FilterX(void);
_RecordsetPtr FilterField(_RecordsetPtr rstTemp, _bstr_t strField, _bstr_t strFilter);
void FilterX2(void);
void PrintProviderError(_ConnectionPtr pCnn1);
void PrintComError(_com_error &e);
inline char* mygets(char* strDest, int n)
{
char strExBuff[10];
char* pstrRet = fgets(strDest, n, stdin);
if (pstrRet == NULL)
return NULL;
if (!strrchr(strDest, '\n'))
// Exhaust the input buffer.
do
{
fgets(strExBuff, sizeof(strExBuff), stdin);
}while (!strrchr(strExBuff, '\n'));
else
// Replace '\n' with '\0'
strDest[strrchr(strDest, '\n') - strDest] = '\0';
return pstrRet;
}
void main()
{
HRESULT hr = S_OK;
if(FAILED(::CoInitialize(NULL)))
return;
FilterX();
//Wait here for user to see the output..
printf("\nPress any key to Continue...");
getch();
//Clear the screen for the next display
system("cls");
FilterX2();
//Wait here for user to see the output..
printf("\nPress any key to Exit...");
getch();
::CoUninitialize();
}
///////////////////////////////////////////////////////////
// //
// FilterX Function //
// //
///////////////////////////////////////////////////////////
void FilterX()
{
// Define ADO object pointers.
// Initialize pointers on define.
// These are in the ADODB:: namespace.
_RecordsetPtr rstPublishers = NULL;
_RecordsetPtr rstPublishersCountry = NULL;
//Define Other Variables
HRESULT hr = S_OK;
_bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
"Initial Catalog='pubs';Integrated Security='SSPI';");
int intPublisherCount = 0;
long recCount = 0;
_bstr_t strCountry;
_bstr_t strMessage;
char *tempStr;
CHAR sz_CountryName[50];
bool boolFlag = TRUE;
try
{
// Open recordset with data from Publishers table.
rstPublishers.CreateInstance(__uuidof(Recordset));
rstPublishersCountry.CreateInstance(__uuidof(Recordset));
rstPublishers->CursorType = adOpenStatic;
TESTHR(rstPublishers->Open("publishers",strCnn,
adOpenStatic , adLockReadOnly,adCmdTable));
// Populate the Recordset.
intPublisherCount = rstPublishers->RecordCount;
// Get user input.
printf("Enter a country to filter on:");
mygets(sz_CountryName, 50);
// Trim the string
tempStr = strtok(sz_CountryName, " \t");
strCountry = tempStr;
if (tempStr == NULL)
{
boolFlag = FALSE;
}
if (boolFlag)
{
if (strcmp(sz_CountryName,""))
{
// Open a filtered Recordset object.
rstPublishersCountry = FilterField(rstPublishers,
"Country", strCountry);
recCount = rstPublishersCountry->GetRecordCount();
if (recCount==0)
{
printf("\nNo publishers from that country.\n");
}
else
{
// Print number of records for the original
// Recordset object and the filtered Recordset
// object.
printf("\nOrders in original recordset:\n%d",
intPublisherCount);
printf("\nOrders in filtered recordset "
"(Country = '%s'): \n%d\n\n", (LPCSTR)strCountry ,
rstPublishersCountry->RecordCount);
}
}
}
}
catch(_com_error &e)
{
// 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:
PrintComError(e);
break;
case VT_DISPATCH:
PrintProviderError(vtConnect);
break;
default:
printf("Errors occured.");
break;
}
}
// Clean up objects before exit.
if (rstPublishers)
if (rstPublishers->State == adStateOpen)
rstPublishers->Close();
if (rstPublishersCountry)
if (rstPublishersCountry->State == adStateOpen)
rstPublishersCountry->Close();
}
_RecordsetPtr FilterField(_RecordsetPtr rstTemp,_bstr_t strField,
_bstr_t strFilter)
{
// Set a filter on the specified Recordset object and then
// open a new Recordset object.
rstTemp->Filter = strField + " = '" + strFilter + "'";
return rstTemp;
}
void FilterX2(void)
{
_RecordsetPtr rstPublishers;
CPublishers publishers;
//Define Other Variables
HRESULT hr = S_OK;
IADORecordBinding *picRs = NULL; //Interface Pointer declared...
_bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
"Initial Catalog='pubs';Integrated Security='SSPI';");
try
{
// Open recordset with data from Publishers table.
rstPublishers.CreateInstance(__uuidof(Recordset));
rstPublishers->CursorType = adOpenStatic;
TESTHR(rstPublishers->Open("SELECT * FROM publishers WHERE "
"Country='USA'",strCnn,adOpenStatic,adLockReadOnly,
adCmdText));
//Open an IADORecordBinding interface pointer
//which we'll use for Binding Recordset to a class
TESTHR(rstPublishers->QueryInterface(
__uuidof(IADORecordBinding), (LPVOID*)&picRs));
//Bind the Recordset to a C++ Class here
TESTHR(picRs->BindToRecordset(&publishers));
// Print current data in recordset.
rstPublishers->MoveFirst();
while (!rstPublishers->EndOfFile)
{
printf("%s, %s\n",
publishers.lP_pubnameStatus == adFldOK ?
publishers.m_szP_pubname: "<NULL>",
publishers.lP_countryStatus == adFldOK ?
publishers.m_szP_country: "<NULL>");
rstPublishers->MoveNext();
}
}
catch (_com_error &e)
{
// 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:
PrintComError(e);
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 (rstPublishers)
if (rstPublishers->State == adStateOpen)
rstPublishers->Close();
}
///////////////////////////////////////////////////////////
// //
// PrintProviderError Function //
// //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pCnn1)
{
// Print Provider Errors from Connection object.
// pErr is a record object in the Connection's Error collection.
ErrorPtr pErr = NULL;
if( (pCnn1->Errors->Count) > 0)
{
long nCount = pCnn1->Errors->Count;
// Collection ranges from 0 to nCount -1.
for(long i = 0; i < nCount; i++)
{
pErr = pCnn1->Errors->GetItem(i);
printf("\t Error number: %x\t%s", pErr->Number,
(LPCSTR) pErr->Description);
}
}
}
///////////////////////////////////////////////////////////
// //
// PrintComError Function //
// //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
// Print Com errors.
printf("Error\n");
printf("\tCode = %08lx\n", e.Error());
printf("\tCode meaning = %s\n", e.ErrorMessage());
printf("\tSource = %s\n", (LPCSTR) bstrSource);
printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}
// EndFilterCpp
FilterX.h
// BeginFilterH
#include "icrsint.h"
//This Class extracts only Pub Name and Country Name.
class CPublishers : public CADORecordBinding
{
BEGIN_ADO_BINDING(CPublishers)
//Column Pub Name is the 2nd field in the recordset
ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szP_pubname,
sizeof(m_szP_pubname), lP_pubnameStatus, TRUE)
//Column Country Name is the 5th field in the recordset
ADO_VARIABLE_LENGTH_ENTRY2(5, adVarChar, m_szP_country ,
sizeof(m_szP_country), lP_countryStatus, TRUE)
END_ADO_BINDING()
public:
CHAR m_szP_pubname[50];
ULONG lP_pubnameStatus;
CHAR m_szP_country[50];
ULONG lP_countryStatus;
};
// EndFilterH