📄 mdmscadoeventinstantiation.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML dir=ltr>
<HEAD>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=gb2312"><title>不同语言的 ADO 事件实例</title>
<style>@import url(msdn_ie4.css);</style>
</HEAD>
<BODY>
<h2><a name="mdmscadoeventinstantiation"></a>不同语言的 ADO 事件实例</h2>
<p><a href="dir.htm">目录</a></p>
<p>
不同的编程语言以不同的方式创建 ADO 事件实例。如下所有范例均创建 <b>ConnectComplete</b> 事件处理程序。</p>
<h3>Visual Basic</h3>
<pre>Dim WithEvent connEvent as Connection
Dim conn as New Connection
set connEvent = conn '打开事件支持。
conn.Open(...)
...
set connEvent = Nothing '关闭事件支持。
...
Private Sub connEvent_ConnectComplete(ByVal err as ADODB.Error, & _
adStatus as ADODB.EventStatus, ByVal pConnectionas ADODB.Connection)
'仅当 adStatus 等于 adStatusErrorsOccurred 时检查错误对象。
...
End Sub
</pre>
<h3>Visual C++</h3>
<p>
这是关于在 VC++ 中如何实例化事件的示意性说明。</p>
<p>
创建在 adoint.h 文件中由 <b>ConnectionEventsVt </b>和 <b>RecordsetEventsVt </b>接口所派生的类。</p>
<pre>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);
...
}
</pre>
<p>
在两个类中执行每个事件处理程序方法。每个方法只返回一个 HRESULT of S_OK 就够了。但是,一旦事件处理程序有效,这些事件处理程序就会在默认状态下被连续调用。为改变这种情况,您可通过将 <b>adStatus</b> 设置为 <b>adStatusUnwantedEvent</b>,以便在第一次调用之后不再请求其他通知。</p>
<pre>STDMETHODIMP CConnEvent::ConnectComplete(
ADOError *pError,
EventStatusEnum *adStatus,
_ADOConnection *pConnection)
{
*adStatus = adStatusUnwantedEvent;
return S_OK;
}
</pre>
<p>
事件类继承了 <b>Iunknown</b>,所以也必须执行 <b>QueryInterface</b>、<b>AddRef </b>和 <b>Release </b>方法。如要执行类构造函数和析构函数,请选择最易于使用并能简化这部分任务的 VC++ 工具。</p>
<p>
通过在 <b>Recordset </b>和 <b>Connection </b>对象上向 <b>IConnectionPointContainer </b>和 <b>IConnectionPoint </b>接口发出 <b>QueryInterface</b>,通知事件处理程序现在已可以使用,然后向各类发出 <b>IConnectionPoint::Advise</b>。</p>
<p>
例如,假设您正在使用布尔型函数,该函数在成功地向 Recordset 对象发出可以使用事件处理程序的通知时返回“真”值。</p>
<pre>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;
...
</pre>
<p>
在此,<b>RecordsetEvent </b>类的事件会被打开并且在 <b>Recordset </b>事件出现时方法将被调用。</p>
<p>
此后,如果您想使事件处理程序无效,可以再次获取连接点并发出 <b>IConnectionPoint::UnAdvise</b> 方法。</p>
<pre>...
hr = pCP->UnAdvise(dwEvtClass); //Turn off event support.
pCP->Release();
if (FAILED(hr)) return FALSE;
...
</pre>
<p>
当然,必须在适当的时候释放接口并毁掉类的对象。</p>
<h3>Visual J++</h3>
<pre>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); //打开事件支持。
conn.open("DSN=pubs");
conn.close();
conn.removeOnConnectComplete(handler); //关闭事件支持。
}
}</pre>
<h3>VBScript</h3>
<p>
VBScript 不支持事件。</p>
<center> <A HREF="http://www.51windows.Net">www.51windows.Net</A></center>
<SCRIPT LANGUAGE="JavaScript" src="/log/sitelog2.asp"></SCRIPT>
<script src="script.js"></script></BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -