Blue Theme Orange Theme Green Theme Red Theme
Home | Forums | Videos | Advertise | Certifications | Downloads | Blogs | Interviews | Jobs | Beginners | Training
 | Consulting  
Submit an Article Submit a Blog 
 Jump to
Skip Navigation Links
Search :       Advanced Search �

Author Rank :
Page Views :
Downloads : 0
Rating :
 Rate it
Level :
Become a Sponsor

This article has been excerpted from book "A Programmer's Guide to ADO.NET in C#".

Events are useful for notifying a program of when an action happens to an object. An event can have a method associated with it. This method is an event handler. When an event occurs, the associated method executed. An event can have multiple event handlers.

A class defines an event by providing an event declaration, which is of type delegate. The following defines an event handler:

        public delegate void EventHandler(object sender, System.EventArgs e);

EventHandler takes two arguments: one of type Object and the other of type System.EventArgs. As you can see from figure 9-1, each of the event handlers has an event argument type that corresponds to it. The event argument class contains the data related to the event, which can be accessed through event argument class members.

In this article, I'll show you how can handle events for ADO.NET objects.

Introducing ADO.NET events

You can divine ADO.NET classes into groups: disconnected classes and data provider classes. The System.Data namespace defines the common event handlers and event argument classes for all data providers. As you can see from figure 9-1, event handler classes come from the Delegate class, and event argument classes come from the EventArgs class.


Figure 9-1 Event handler and event argument classes defines in the System.Data namespace

You use the DataColumnChangeEventHandler as an event handler for DataColumn when you are changing a value for a column in a DataRow. You use DataRowChangeEventHandler as an event handler that handles the RowChanging, RowChanged, RowDeleting, and RowDeleted events of a DataTable. You use the FillErrorEventHandler as an event handler that handles a data adapter's Fill event. If an error occurs during the fill operation, then FillError fires, which executes FillErrorEventHandler. MergeFailedEventHandler handles a dataset's MergeFailed event, which occurs when a dataset's merge operation fails. StateChangeEventHandler handles the StateChange event, which occurs when the connection state changed. Besides the Data namespace defining the event handler and event argument classes, the data provider-specific namespace also define the data provider event handler and event argument classes. Some of these classes and their usage may vary from provider to provider. Figure 9-2 shows the OleDbdata provider event handlers and event argument classes.


Figure 9-2 OleDb data provider event handler and event arguments

OleDbInfoMessageEventHandler handles the InfoMessage event of OleDbConnection. An InfoMessage event occurs when a provider sends a warning or an informational message to the application.

OleDbRowUpdateEventHandler handles the RowUpdate event of OleDbDataAdapter. The RowUpdated event occurs when you call an Update method on a data adapter.

OleDbRowUpdatingEventHandler handles the RowUpdating event of OleDbDataAdapter. The RowUpdating event occurs before a command executes against the data source.

Working with Connection Events

The Connection object has two events that notify the application if a connection state changes. You can use these events to retrieve informational messages from a data source or to determine if the state of Connection changes. These two events are InfoMessage and StateChange. The InfoMessage event occurs when an informational message is returned from a data source. The exception handling doesn't catch these messages. The StateChange event occurs only when the state of a connection changes.

The InfoMessage event receives an InfoMessageEventArgs object. The InfoMessageEventArgs is as follows:

        public delegate void OleDbInfoMessageEventHandler(object sender, OleDbInfoMessageEventArgs e);

Where Sender is the source of the event of the event and e is an OleDbInfoMessageEventArgs object that contains the event data. Table 9-1 defines the InfoMessageEventArgs properties.

Table 9-1 The InfoMessageEventArgs properties




Returns HRESULT following the ANSI SQL standard for the database


Returns the collection of warnings sent from the data source


Return the full text of the error


Return the name of the object that generated the error

Caution: Some if these members may vary for other data providers. For example, the Sql data provider doesn't have an ErrorCode property.

The StateChange event occurs when the state of Connection changes. The StateChange event receives StateChangeEventArgs, which enables you to determine the changes in state of Connection using the OriginalState and CurrentState properties. The OriginalState property represents the original state of the connection, and the CurrentState property represents the current state of the connection. The ConnectionState enumeration defines properties for connection states (see Table 9-2).

Table 9-2 The ConnectionState Properties




This state occurs when the connection is broken after it was opened.


The connection is closed.


The connection is connected to a data source.


The connection object is execution a command.


The connection object is retrieving data.


The connection is open.

To test the connection events, I created a windows application and added two buttons to the form. I then set the name of the button control to StateChangeEventBtn and InfoMessageEventBtn. I also set the text of the buttons to "StateChange Event" and "InfoMessage Event". The final form looks like figure 9-3.


Figure 9-3 Windows application for testing connection events

You can add both connection events programmatically as well as at design-time. To add these events from VS.NET, just drag an SqlConnection (or OleDbConnection) from toolbox's Data tab to a form and write events from the properties windows. As you can see in figure 9-4, you merely double-click the InfoMessage and StateChange events to write event handlers for them.


Figure 9-4 Adding the InfoMessage and StateChange event

Write the code in listing 9-1 for both the events.

Listing 9-1 Writing event handlers for the InfoMessage and StateChange events

// Connection InfoMessage Event Handler
        private void sqlConnection1_InfoMessage(object sender, System.Data.SqlClient.SqlInfoMessageEventArgs e)
            int i;

            for (i = 0; i < e.Errors.Count; i++)

        private void sqlConnection1_StateChange(object sender, System.Data.StateChangeEventArgs e)
            MessageBox.Show("Original State:" + e.OriginalState.ToString()
            + ", New state = " + e.CurrentState.ToString());

Note: Don't forget to add a reference to the data provider namespace.

To test these events, write code on the StateChange event and InfoMessage event button-click handlers (see listing 9-2). As you can see, the StateChangeEventBtn_Click handler opens a connection and then closes the connection. Opening and closing a connection invokes the StateChanges event and executes code written on the StateChange event handler.

On the InfoMessageBtn_Click handler, I opened a connection, called the ChangeDatabase method of SqlConnection and then closed the connection. The ChangeDatabase method invokes InfoMessageEvent.

Listing 9-2 Writing code that executes connection events

        private void StateChangeEventBtn_Click(object sender, System.EventArgs e)
// Create a Connection object
                string ConnectionString = "Integrated Security=SSPI;" +
                "Initial Catalog=Northwind;" +
                "Data Source =MAIN-SERVER";

                sqlConnection1.ConnectionString = ConnectionString;

// Open the connection
                if (sqlConnection1.State != ConnectionState.Open)

// Close the connection

            catch (Exception ex)

        private void InfoMessageEventBtn_Click(object sender, System.EventArgs e)
// Create a Connection Object
                string ConnectionString = "Integrated Security=SSPI;" +
                "Initial Catalog = Northwind;" +
                "Data Source=localhost;";
                sqlConnection1.ConnectionString = ConnectionString;

// Open the connection
                if (sqlConnection1.State != ConnectionState.Open)

//Change database

// Close the connection

            catch (Exception ex)

The output of the StateChange event's button-click handler looks like figure 9-5 and figure 9-6. The StateChangeEventBtn_Click method fires the StateChange event two times-first when you call the Open method and the connection state changes from closed to open and, second, when you call the Close method and the connection state changes from open to closed.


Figure 9-5 The StateChangeEvent output when you call the open method


Figure 9-6 The StateChangeEvent output when you call the Close method

The output of InfoMessageBtn click looks like figure 9-7, which shows the database changing to master as a result of the ChangeDatabase method.


Figure 9-7 The InfoMessage event output when you call the ChangeDatabase method


Hope this article would have helped you in understanding
handling ADO .NET Events & Connection Events. See other articles on the website also for further reference.

This essential guide to Microsoft's ADO.NET overviews C#, then leads you toward deeper understanding of ADO.NET.

 [Top] Rate this article
 About the author
 Post a Feedback, Comment, or Question about this article

 � 2023  contents copyright of their authors. Rest everything copyright Mindcracker. All rights reserved.