Handler 속성 예제(VC++)
중요
Windows 8 및 Windows Server 2012부터, RDS 서버 구성 요소는 더 이상 Windows 운영 체제에 포함되지 않습니다(자세한 내용은 Windows 8 및 Windows Server 2012 호환성 쿡북 참조). RDS 클라이언트 구성 요소는 이후 버전의 Windows에서 제거될 예정입니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요. RDS를 사용하는 애플리케이션은 WCF Data Service로 마이그레이션해야 합니다.
이 예제에서는 RDS DataControl 개체 Handler 속성을 보여 줍니다. (자세한 내용은 DataFactory 사용자 지정을 참조하세요.)
다음 섹션에서는 매개 변수 파일 Msdfmap.ini가 서버에 있다고 가정합니다.
[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"
코드는 다음과 같습니다. SQL 속성에 할당된 명령은 AuthorById 식별자와 일치하며 작성자 Michael O'Leary에 대한 행을 검색합니다. 코드의 Connect 속성은 Northwind 데이터 원본을 지정하지만 해당 데이터 원본은 Msdfmap.ini 연결 섹션에서 덮어씁니다. DataControl 개체 Recordset 속성은 코딩 편의를 위해 연결이 끊어진 Recordset 개체에 할당됩니다.
// 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);
}