Handler Property Example (VC++)
Important
Beginning with Windows 8 and Windows Server 2012, RDS server components are no longer included in the Windows operating system (see Windows 8 and Windows Server 2012 Compatibility Cookbook for more detail). RDS client components will be removed in a future version of Windows. Avoid using this feature in new development work, and plan to modify applications that currently use this feature. Applications that use RDS should migrate to WCF Data Service.
This example demonstrates the RDS DataControl object Handler property. (See DataFactory Customization for more details.)
Assume the following sections in the parameter file, Msdfmap.ini, located on the server:
[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"
Your code looks like the following. The command assigned to the SQL property will match the AuthorById identifier and will retrieve a row for author Michael O'Leary. Although the Connect property in your code specifies the Northwind data source, that data source will be overwritten by the Msdfmap.ini connect section. The DataControl object Recordset property is assigned to a disconnected Recordset object purely as a coding convenience.
// 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);
}