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
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
#import "C:\Program Files\Common Files\System\MSADC\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);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
//////////////////////////////////////////////////////////
// //
// Main Function //
// //
//////////////////////////////////////////////////////////
void main()
{
HRESULT hr = S_OK;
hr = ::CoInitialize(NULL);
if (SUCCEEDED(hr))
{
HandlerX();
printf("Press any key to continue...");
getch();
::CoUninitialize();
}
}
//////////////////////////////////////////////////////////
// //
// HandlerX Function //
// //
//////////////////////////////////////////////////////////
void HandlerX(void)
{
HRESULT hr = S_OK;
// Define ADO object pointers.
// Initialize pointers on define.
// These are 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->Server = "http://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);
}
}
//////////////////////////////////////////////////////////
// //
// 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("\t Error number: %x\t%s", pErr->Number, 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);
}
// EndHandlerCpp
DataControl Object (RDS) | Handler Property (RDS)