ADO.NET – 从托管提供程序获取通知事件






3.67/5 (6投票s)
2001年5月4日
3分钟阅读

81262

784
如何使用各种 ADO.NET 连接和数据对象的事件处理程序。
引言
和 ADO 一样,ADO.NET 提供了机制,您可以使用它来获取托管提供程序在发生某些操作或已发生某些操作时引发的事件。这是一个很酷的功能,在某些情况下,当您想根据数据库访问层要遵循的规则更改操作时,它会非常方便。例如,应用程序更改表中一列的值。应用程序可能不知道它应该遵循的所有规则,以判断它正在更改的值是否合法。然后,您可以为该DataTable
设置一个事件通知函数,以便在更改该表的列时收到通知。然后,您可以检查正在更改的值,并根据业务规则,您可以让它通过或更改该事件通知中的值,以便将有效值输入到数据库中。这只是事件处理程序如何帮助您控制事件和数据流的变化的一个例子。ADO.NET 支持两种托管提供程序。一种基于 OLE DB,另一种用于 SQL Server。对于这两种类型的托管提供程序,您将在 .NET 框架中看到两个命名空间,System.Data.ADO
和System.Data.SQL
。顾名思义,System.Data.SQL
专门用于 SQL Server 7.0 及更高版本。
在本文中,我将使用通用的基于 OLE DB 的提供程序System.Data.ADO
命名空间。每个数据库应用程序做的第一件事是打开与数据库的连接。您将使用ADOConnection
对象来建立此连接。在建立此连接时,服务器可能会遇到一些问题。对于所有这些问题,服务器会发送包含有关警告和错误信息的事件。您可以为连接对象添加事件处理程序。ADOConnection
对象支持InfoMessage
事件以接收这些通知。这些消息在ADOInfoMessageEventArgs
对象中传递回来。此事件支持以下属性。
ErrorCode
错误
Message
来源
查看参考文档以获取有关这些属性的详细信息。但简而言之,我可以告诉您这些属性可以为您提供有关错误的完整描述,例如完整的错误文本,错误来源等。
这是一个关于如何将事件处理程序添加到您的ADOConnection
对象的例子。首先,将事件处理程序添加到连接对象。
String strConnection = "Provider= SQLOLEDB.1;
Data Source=localhost; uid=sa; pwd=; Initial Catalog=northwind";
m_ADOConnection = new ADOConnection (strConnection);
m_ADOConnection.InfoMessage += new
ADOInfoMessageEventHandler (OnInfoMessageFromConnection);
m_ADOConnection.StateChange +=
new StateChangeEventHandler (OnStateChange);
然后,您需要为事件提供事件处理程序函数。例如,在本例中为OnInfoMessageFromConnection
和OnStateChange
。
protected static void OnInfoMessageFromConnection
(object sender, ADOInfoMessageEventArgs args)
{
Trace.Write ("Info Message Recieved From Server");
Trace.Write (args.Message);
Trace.Write ("End Of Message From Server");
}
protected static void OnStateChange(object sender, StateChangeEventArgs e)
{
PrintEventArgs(e);
}
建立连接后,下一步是从数据存储区检索数据,然后对其进行操作。信息在DataTable
对象中访问。然后,您更改信息并将更改提交到数据源。DataTable
对象支持以下您可以拦截的事件。
ColumnChanging(列更改)
PropertyChanged
RowChanged(行已更改)
RowChanging(行正在更改)
RowDeleted
RowDeleting
事件的名称非常不言自明。因此,根据您的需求,您可以为这些事件添加事件处理程序。这是一个关于如何做到这一点的例子。
public static void SetEventHandlers (DataTable table)
{
table.ColumnChanging += new
DataColumnChangeEventHandler (ColumnChangingEvtHandler);
table.RowChanging += new
DataRowChangeEventHandler RowChangingEvtHandler);
table.RowChanged += new
DataRowChangeEventHandler (RowChangedEvtHandler);
table.RowDeleting += new
DataRowChangeEventHandler (RowDeletingEvtHandler);
table.RowDeleted += new
DataRowChangeEventHandler (RowDeletedEvtHandler);
}
public static void RowChangingEvtHandler
(object sender, DataRowChangeEventArgs args)
{
Trace.Write ("Row Changing: " + args.Row.ToString ());
}
public static void RowChangedEvtHandler
(object sender, DataRowChangeEventArgs args)
{
Trace.Write ("Row Changed: " + args.Row.ToString ());
}
public static void RowDeletingEvtHandler
(object sender, DataRowChangeEventArgs args)
{
Trace.Write ("Row Deleting: " + args.Row.ToString ());
}
public static void RowDeletedEvtHandler
(object sender, DataRowChangeEventArgs args)
{
Trace.Write ("Row Deleted: " + args.Row.ToString ());
}
public static void ColumnChangingEvtHandler
(object sender, DataColumnChangeEventArgs args)
{
Trace.Write ("Column Changing: " + args.Column.ColumnName);
}
除了ColumnChanging
之外,大多数这些事件都只是提供信息,您可以在其中更改正在设置的值。
DataSet
对象支持以下事件。
MergeFailed(合并失败)
PropertyChanged
与我为DataTable
添加事件的方式类似,您可以为此对象添加事件。MergeFailed
事件在两个表由于某些约束而无法合并时发生。PropertyChanged
事件在属性值更改时发生。
DataRelation
类表示表之间的父/子关系,只有一个事件PropertyChanged
。每当DataRelation
的属性值更改时,都会发生此事件。