Handler, exemple de propriété (VC++)
Important
À compter de Windows 8 et Windows Server 2012, les composants serveur RDS ne sont plus inclus dans le système d’exploitation Windows (voir le Guide pratique sur la compatibilité de Windows Server 2012 et Windows 8 pour plus de détails). Les composants clients RDS seront supprimés dans une version ultérieure de Windows. Évitez d'utiliser cette fonctionnalité dans de nouveaux travaux de développement, et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité. Les applications qui utilisent RDS doivent migrer vers WCF Data Service.
Cet exemple démontre illustre propriété Handler de l’objet RDS DataControl. (Pour plus d’informations, consultez Personnalisation de DataFactory.)
Supposons que nous avons les sections suivantes dans le fichier de paramètres, Msdfmap.ini, situé sur le serveur :
[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"
Votre code ressemble à ce qui suit. La commande affectée à la propriété SQL correspond à l’identificateur AuthorById et récupère une ligne pour l’auteur Michael O’Leary. Bien que la propriété Connect de votre code spécifie la source de données Northwind, cette source de données sera remplacée par la section connect de Msdfmap.ini. La propriété Recordset de l’objet DataControl est affectée à un objet Recordset déconnecté par pure commodité de codage.
// BeginHandlerCpp.cpp
// compile with: /EHsc
#import "msado15.dll" no_namespace rename("EOF", "EndOfFile")
#import "msadco.dll"
#include <ole2.h>
#include <stdio.h>
#include <conio.h>
// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void HandlerX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
int main() {
HRESULT hr = S_OK;
hr = ::CoInitialize(NULL);
if (SUCCEEDED(hr)) {
HandlerX();
::CoUninitialize();
}
}
void HandlerX() {
HRESULT hr = S_OK;
// Define and initialize ADO object pointers, in the ADODB namespace.
_RecordsetPtr pRst = NULL;
// Define RDS object pointers.
RDS::IBindMgrPtr dc;
try {
TESTHR(hr = dc.CreateInstance(__uuidof(RDS::DataControl)));
dc->Handler = "MSDFMAP.Handler";
dc->ExecuteOptions = 1;
dc->FetchOptions = 1;
dc->Server = "https://MyServer";
dc->Connect = "Data Source=AuthorDatabase";
dc->SQL = "AuthorById('267-41-2394')";
// Retrieve the record.
dc->Refresh();
// Use another Recordset as a convenience.
pRst = dc->GetRecordset();
printf("Author is %s %s",
(LPSTR)(_bstr_t) pRst->Fields->GetItem("au_fname")->Value,
(LPSTR)(_bstr_t) pRst->Fields->GetItem("au_lname")->Value);
pRst->Close();
} // End Try statement.
catch (_com_error &e) {
PrintProviderError(pRst->GetActiveConnection());
PrintComError(e);
}
}
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("\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);
}