Practical ASP.NET

Handling Update Exceptions in the DataView Events

Peter shows a "code-lite" way to handle exceptions when using DataView to update data.

Exploiting the DataView events means less work for you and more robust code in your application. Just don't be afraid to write less code.

In the introductory course on ASP.NET that I wrote for Learning Tree International, we eventually come to the moment when we display data in a page. The students drop a DataSource and a DataView on the page, configure the two objects, and retrieve the data.

The only problem is that there will be at least one student in each class who will complain that "I didn't get to write any code -- we just used the Wizards."

Unless you're paid by the hour, it's not clear to me why this is a bad thing: The less code I write, the less likely I am to introduce a new bug.

More critically, the complaint reflects a fundamental misunderstanding of the ASP.NET 2.0 paradigm: Configure components to get base behavior and write code only for your special needs.

To placate my unhappy students, I usually show them how to write code to handle truly "special events": exceptions when updating data with the DataView.

Exploiting DataView Events
The DataView controls fire events both before and after each data access activity. The event names are similar among all the DataViews (GridView, FormView, DetailsView, etc.). A Deleting event before any deletions/a Deleted event after the deletion; an Updating event before updates/an Updated afterward, and so on.

One of my gurus, Ken Getz, refers to these as the "gerund events" and the "past participle events." I refer to them as the *ing events and the *ed events. I think my terms are more helpful but you're welcome to your opinion.

The *ing events are useful for preventing problems; anything you can do there to detect bad data means one less trip to the database server and faster feedback to your users. But the *ed events on the DataViews are where you'll handle problems when something goes awry.

The e parameter on those events provides five really useful features: access to any Exception object raised during the data access, a flag to keep the DataView in edit or insert mode, the number of records changed (primarily useful if you're using the SqlDataSource), and a flag to tell ASP.NET that you've taken care of any problems.

When I write an *ed event, I first check to see if there was an error during the update by checking the e parameter's Exception property. If there is an Exception object with an error that I'm willing to handle, I do the decent thing and display the error message from the Exception object to the user. I also usually keep the DataView in change mode by setting the e parameter's KeepInEditMode (in Updated events) or KeepInInsertMode (in Inserted events) property to True. This gives the user another chance to enter their change (the user can always click the Cancel button to get out). I also set the e parameter's ExceptionHandled property to True because if I don't, the error will propagate up through the calling modules and ASP.NET may terminate my application.

If I'm not willing to handle the exception, I do nothing: The ExceptionHandled property defaults to False so the error will just move on up until some component takes care of it.

If I don't have an Exception, I still check to see if any records were updated by looking at the e parameter's AffectedRows property. If the AffectedRows property is 0, then it probably means that my user's data was changed after the user retrieved it and I used optimistic currency to skip the update (see my column on optimistic currency, "Handling Data Contention with Optimistic Concurrency"). For me, the right thing to do when someone else has changed the data is to re-DataBind the associated DataView to let the user see the latest data.

Putting it all together, the essential *ed event code looks like this.

Sadly, these eight lines of code usually aren't enough to satisfy my code-hungry students. They still go out of the room grumbling that all I've shown them is how to work with the Wizards and, now, how to fiddle with properties.

About the Author

Peter Vogel is a system architect and principal in PH&V Information Services. PH&V provides full-stack consulting from UX design through object modeling to database design. Peter tweets about his VSM columns with the hashtag #vogelarticles. His blog posts on user experience design can be found at http://blog.learningtree.com/tag/ui/.

comments powered by Disqus

Featured

  • Compare New GitHub Copilot Free Plan for Visual Studio/VS Code to Paid Plans

    The free plan restricts the number of completions, chat requests and access to AI models, being suitable for occasional users and small projects.

  • Diving Deep into .NET MAUI

    Ever since someone figured out that fiddling bits results in source code, developers have sought one codebase for all types of apps on all platforms, with Microsoft's latest attempt to further that effort being .NET MAUI.

  • Copilot AI Boosts Abound in New VS Code v1.96

    Microsoft improved on its new "Copilot Edit" functionality in the latest release of Visual Studio Code, v1.96, its open-source based code editor that has become the most popular in the world according to many surveys.

  • AdaBoost Regression Using C#

    Dr. James McCaffrey from Microsoft Research presents a complete end-to-end demonstration of the AdaBoost.R2 algorithm for regression problems (where the goal is to predict a single numeric value). The implementation follows the original source research paper closely, so you can use it as a guide for customization for specific scenarios.

  • Versioning and Documenting ASP.NET Core Services

    Building an API with ASP.NET Core is only half the job. If your API is going to live more than one release cycle, you're going to need to version it. If you have other people building clients for it, you're going to need to document it.

Subscribe on YouTube