Handler-Eigenschaft – Beispiel (VC++)
Wichtig
Ab Windows 8 und Windows Server 2012 sind RDS-Serverkomponenten nicht mehr im Windows-Betriebssystem enthalten (weitere Informationen finden Sie in den jeweiligen Kompatibilitäts-Cookbooks zu Windows 8 und Windows Server 2012). RDS-Clientkomponenten werden in einer zukünftigen Version von Windows entfernt. Nutzen Sie diese Funktionen bei Neuentwicklungen nicht mehr, und planen Sie die Änderung von Anwendungen, die diese Funktion zurzeit verwenden. Anwendungen, die RDS verwenden, sollten zu WCF Data Service migriert werden.
Dieses Beispiel demonstriert die Eigenschaft Handler des RDS DataControl-Objekts. (Siehe DataFactory-Anpassung für weitere Details).
Gehen Sie davon aus, dass die folgenden Abschnitte in der Parameterdatei Msdfmap.ini, die sich auf dem Server befindet, enthalten sind:
[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"
Ihr Code sieht wie folgt aus. Der Befehl, der der SQL-Eigenschaft zugewiesen ist, entspricht dem Bezeichner AuthorById und ruft eine Zeile für den Autor Michael O'Leary ab. Obwohl die Connect-Eigenschaft in Ihrem Code die Northwind-Datenquelle angibt, wird diese Datenquelle vom Abschnitt Msdfmap.ini Connect überschrieben. Die Recordset-Eigenschaft des DataControl-Objekts ist einem nicht verbundenen Recordset-Objekt zugewiesen, um die Codierung zu erleichtern.
// 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);
}