65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (6投票s)

2001年5月4日

3分钟阅读

viewsIcon

81262

downloadIcon

784

如何使用各种 ADO.NET 连接和数据对象的事件处理程序。

引言

和 ADO 一样,ADO.NET 提供了机制,您可以使用它来获取托管提供程序在发生某些操作或已发生某些操作时引发的事件。这是一个很酷的功能,在某些情况下,当您想根据数据库访问层要遵循的规则更改操作时,它会非常方便。例如,应用程序更改表中一列的值。应用程序可能不知道它应该遵循的所有规则,以判断它正在更改的值是否合法。然后,您可以为该DataTable设置一个事件通知函数,以便在更改该表的列时收到通知。然后,您可以检查正在更改的值,并根据业务规则,您可以让它通过或更改该事件通知中的值,以便将有效值输入到数据库中。这只是事件处理程序如何帮助您控制事件和数据流的变化的一个例子。ADO.NET 支持两种托管提供程序。一种基于 OLE DB,另一种用于 SQL Server。对于这两种类型的托管提供程序,您将在 .NET 框架中看到两个命名空间,System.Data.ADOSystem.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);

然后,您需要为事件提供事件处理程序函数。例如,在本例中为OnInfoMessageFromConnectionOnStateChange

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的属性值更改时,都会发生此事件。

© . All rights reserved.