Esempio della proprietà MaxRecords (VC++)
In questo esempio viene usata la proprietà MaxRecords per aprire un Recordset contenente i 10 titoli più costosi nella tabella Titles.
Esempio
// MaxRecords_Property_Example.cpp
// compile with: /EHsc
#import "msado15.dll" no_namespace rename("EOF","EndOfFile")
#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "icrsint.h"
// This class extracts titles and type from the titles table
class CTitleRs : public CADORecordBinding {
BEGIN_ADO_BINDING(CTitleRs)
// Column title is the 1st field in the Recordset
ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar,m_szau_Title,
sizeof(m_szau_Title), lau_TitleStatus, FALSE)
// Column price is the 2nd field in the Recordset
ADO_VARIABLE_LENGTH_ENTRY2(2, adDouble, m_szau_Price,
sizeof(m_szau_Price), lau_PriceStatus, FALSE)
END_ADO_BINDING()
public:
CHAR m_szau_Title[81];
ULONG lau_TitleStatus;
DOUBLE m_szau_Price;
ULONG lau_PriceStatus;
};
// Function Declarations
inline void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); };
void MaxRecordsX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
int main() {
if ( FAILED(::CoInitialize(NULL)) )
return -1;
MaxRecordsX();
::CoUninitialize();
}
void MaxRecordsX() {
// Define ADO ObjectPointers. Initialize Pointers on define
// These are in the ADODB :: namespace
_RecordsetPtr pRstTemp = NULL;
// Define Other Variables
IADORecordBinding *picRs = NULL; // Interface Pointer Declared
CTitleRs titlers; // C++ Class Object
try {
// Assign Connection String to Variable
_bstr_t strCnn("Provider='sqloledb'; Data Source='My_Data_Source'; Initial Catalog='pubs'; Integrated Security='SSPI';");
// Open Recordset containing the 10 most expensive titles in the Titles table.
TESTHR(pRstTemp.CreateInstance(__uuidof(Recordset)));
pRstTemp->MaxRecords = 10;
pRstTemp->Open("SELECT title,price FROM Titles ORDER BY Price DESC",
strCnn, adOpenForwardOnly, adLockReadOnly, adCmdText);
// Open IADORecordBinding interface pointer for binding Recordset to a class
TESTHR(pRstTemp->QueryInterface(__uuidof(IADORecordBinding), (LPVOID*)&picRs));
// Bind the Recordset to a C++ class here
TESTHR(picRs->BindToRecordset(&titlers));
// Display the contents of the Recordset
printf("Top Ten Titles by Price:\n\n");
while ( !(pRstTemp->EndOfFile) ) {
printf("%s --- %6.2lf\n", titlers.lau_TitleStatus == adFldOK ?
titlers.m_szau_Title : "<NULL>", titlers.lau_PriceStatus == adFldOK ?
titlers.m_szau_Price : 0.00);
pRstTemp->MoveNext();
}
}
catch(_com_error &e) {
// Display errors, if any. Pass connection pointer accessed from the Recordset.
_variant_t vtConnect = pRstTemp->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 occurred.");
break;
}
}
// Clean up objects before exit. Release the IADORecordset Interface here
if (picRs)
picRs->Release();
if (pRstTemp)
if (pRstTemp->State == adStateOpen)
pRstTemp->Close();
};
void PrintProviderError(_ConnectionPtr pConnection) {
// Print Provider Errors from Connection object
// pErr is a record object in the Connection's Error collection
ErrorPtr pErr = NULL;
if ( (pConnection->Errors->Count)>0 ) {
long nCount = pConnection->Errors->Count;
// Collection ranges from 0 to nCount-1
for ( long i = 0 ; i < nCount ; i++ ) {
pErr = pConnection->Errors->GetItem(i);
printf("\t Error Number :%x \t %s", pErr->Number, pErr->Description);
}
}
}
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);
}
Primi dieci titoli per prezzo:
Ma è facile da usare? --- 22.95
Individui fobici e non fobici del computer: variazioni di comportamento --- 21.59
Cipolle, porri e aglio: i segreti della cucina mediterranea --- 20.95
Segreti della Silicon Valley --- 20.00
The Busy Executive's Database Guide --- 19.99
Dissertazioni sui computer --- 19.99
Delizie gastronomiche della Silicon Valley --- 19.99
Privazione prolungata dei dati: quattro casi di studio --- 19.99
Qualcuno vuole il sushi? --- 14.99
Cinquanta anni nelle cucine di Buckingham Palace --- 11.95