プログラミング言語によって、ADO イベントのインスタンスの作成方法が異なります。次の例はいずれも ConnectComplete イベント ハンドラを作成します。
Visual Basic で ADO イベントのインスタンスを作成するには、2 つの方法があります。どちらの方法においても、WithEvents キーワードを使用して宣言されたオブジェクト変数が Class モジュールの一部であることと、オブジェクトがモジュール内のすべてのコードの管理下にある適用範囲を持っていることが必要です。最初のインスタンス内では、イベント オブジェクトおよびそのオブジェクトと連携させる別のオブジェクトを作成します。(Form オブジェクトは、Visual Basic では Class です。)
Dim WithEvents connEvent as Connection
Dim conn as New Connection
Private Sub MySub()
set connEvent = conn ' Enable event support.
conn.Open(...)
...
set connEvent = Nothing ' Disable event support.
...
End Sub
Private Sub connEvent_ConnectComplete(ByVal err as ADODB.Error, & _
adStatus as ADODB.EventStatus, ByVal pConnection as ADODB.Connection)
' Check the error object only if adStatus
' equals adStatusErrorsOccurred.
...
End Sub
2 番目のインスタンスでは、1 つのオブジェクトのみが使用されます。
Dim WithEvents conn as New Connection
Private Sub MySub()
conn.Open(...)
...
set conn = Nothing ' Disable event support.
...
End Sub
Private Sub conn_ConnectComplete(ByVal err as ADODB.Error, & _
adStatus as ADODB.EventStatus, ByVal pConnection as ADODB.Connection)
' Check the error object only if adStatus
' equals adStatusErrorsOccurred.
...
End Sub
これは、Visual C++ での ADO イベントのインスタンス作成の方法を示す概略的な説明です。詳細については、「ADO イベント モデルの例 (VC++)」を参照してください。
ファイル adoint.h 内の ConnectionEventsVt および RecordsetEventsVt インターフェイスから派生したクラスを作成します。
class CConnEvent : public ConnectionEventsVt
{
public:
STDMETHODIMP InfoMessage(
ADOError *pError,
EventStatusEnum *adStatus,
_ADOConnection *pConnection);
...
}
class CRstEvent : public RecordsetEventsVt
{
public:
STDMETHODIMP WillChangeField(
LONG cFields,
VARIANT Fields,
EventStatusEnum *adStatus,
_ADORecordset *pRecordset);
...
}
これらのイベント ハンドラ メソッドをそれぞれ、両方のクラスに実装します。それぞれのメソッドは単に S_OK の HRESULT を返すだけで十分です。ただし、イベント ハンドラが使用可能であることをメソッドに知らせると、既定ではこれらが連続して呼び出されます。代わりに、adStatus を adStatusUnwantedEvent に設定して、初回以降の通知を要求しないようにすることができます。
STDMETHODIMP CConnEvent::ConnectComplete(
ADOError *pError,
EventStatusEnum *adStatus,
_ADOConnection *pConnection)
{
*adStatus = adStatusUnwantedEvent;
return S_OK;
}
イベント クラスは IUnknown から継承されるので、QueryInterface、AddRef、および Release メソッドも実装する必要があります。クラス コンストラクタおよびデストラクタも実装します。この部分のタスクを簡略化する最も使いやすい Visual C++ ツールを選んでください。
Recordset および Connection オブジェクトで、QueryInterface を IConnectionPointContainer および IConnectionPoint インターフェイスに対して発行して、イベント ハンドラが使用可能であることを通知します。次に、各クラスに IConnectionPoint::Advise を発行します。
たとえば、イベント ハンドラが使用できることを Recordset オブジェクトに通知することに成功した場合に True を返すブール型 (Boolean) 関数を使用していると想定します。
HRESULT hr;
DWORD dwEvtClass;
IConnectionPointContainer *pCPC = NULL;
IConnectionPoint *pCP = NULL;
CRstEvent *pRStEvent = NULL;
...
_RecordsetPtr pRs;
pRs.CreateInstance(__uuidof(Recordset));
pRStEvent = new CRstEvent();
if (pRStEvent == NULL) return FALSE;
...
hr = pRs->QueryInterface(IID_IConnectionPointContainer, &pCPC);
if (FAILED(hr)) return FALSE;
hr = pCPC->FindConnectionPoint(IID_ADORecordsetEvents, &pCP);
pCPC->Release(); // Always Release now, even before checking.
if (FAILED(hr)) return FALSE;
hr = pCP->Advise(pRstEvent, &dwEvtClass); //Turn on event support.
pCP->Release();
if (FAILED(hr)) return FALSE;
...
return TRUE;
...
この時点では、RecordsetEvent ファミリのイベントは有効状態になっていて、Recordset イベントが発生すると作成したメソッドが呼び出されます。
その後イベント ハンドラを無効状態にするときは、再び接続ポイントを取得し、IConnectionPoint::Unadvise メソッドを発行します。
...
hr = pCP->UnAdvise(dwEvtClass); //Turn off event support.
pCP->Release();
if (FAILED(hr)) return FALSE;
...
インターフェイスの解放とクラス オブジェクトの破棄は、適切に行う必要があります。
import wfc.data.*;
public class MyClass
{
ConnectionEventHandler handler =
new ConnectionEventHandler(this,"onConnectComplete");
public void onConnectComplete(Object sender,ConnectionEvent e)
{
if (e.adStatus == AdoEnums.EventStatus.ERRORSOCCURRED)
System.out.println("Connection failed");
else
System.out.println("Connection completed");
return;
}
void main( void )
{
Connection conn = new Connection();
conn.addOnConnectComplete(handler); // Enable event support.
conn.open("DSN=Pubs");
conn.close();
conn.removeOnConnectComplete(handler); // Disable event support.
}
}
VBScript はイベントをサポートしていません。