Handling errors in MFC when using ADO and MS Datagrid ActiveX control


I'm writing an app using VS.NET 2003, MFC only (no .NET components), Unicode, Windows XP SP2. I link to ADO using these lines

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename( "EOF", "ADOEOF")
#pragma warning(default: 4146)
#import "C:\Program Files\Common Files\System\ole db\oledb32.dll" rename_namespace("msdasc")
#pragma warning(default: 4192)  

Next, I used the form layout editor to add the MS Datagrid ActiveX control. I connect to a table called Workers that contains two fields: ID and Name, both must be non-null and unique. The grid displays this table that's opened in a ADO Recordset object that connects to an Access XP database file.  When the user wants to add a new worker, I ask for the new name and then call the following code

  m_Datagrid.put_Enabled( FALSE);
  try {
     if (!(long)dbRecordset || !(dbRecordset->GetState( ) & ADODB::adStateOpen)) {
        BolekVrany::DisplayError( IDS_ERR_CONNECT_TABLE);
     dbRecordset->AddNew( );
     _bstr_t    bstr;
     _variant_t var;

     bstr = sName;
     var.bstrVal = bstr;
     var.vt      = VT_BSTR;
     dbRecordset->Fields->GetItem(L"Name")->PutValue( var);
     dbRecordset->Update( );
  } catch (_com_error &e) {
     int i = 0;
     try {
         i = 1;
         dbRecordset->CancelUpdate( );
     } catch (_com_error &e) {
         MessageBox( e.Description( ));
         i = 2;
     MessageBox( L"Bla");
  m_Datagrid.put_Enabled( TRUE);

The problem is that when the user enters a duplicate name, the Update method raises an error. It gets caught in the first catch block but when I call CancelUpdate, the Datagrid displays an error message and CancelUpdate raises another error which gets caught by the second handler etc. The problem is that this seems to be recursive so when I catch this exception and call CancelUpdate there, I simply end up with another exception etc. When the grid is not connected to the recordset, the code works fine and the first CancelUpdate works without any exceptions. When grid is connected to the recordset, it fails in the described manned even thought the grid is disabled.

I tried also tried to override the error handler of the grid but it had no effect on the recursive generation of exceptions. I was able to prevent the grid from displaying the message, but the problem remained recursive.

I will be glad for any suggestions on how to handle this except for the most obvious one, ie. disconnecting the grid before trying to update the recordset. The table is short right now but I would like a more elegant solution.

Thanks a lot
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

DanRollinsConnect With a Mentor Commented:
It seems to me that if the Update method fails, there would be no need to use CancelUpdate; that is, since the Update didn't occur, what is there to cancel?

My standard advice is to remove all try/catch handling and allow the error to occur "naturally."   Then you can see the situation stripped of any chance that your error-handling logic might, itself, be responsible for (part of) the problem.

-- Dan
All Courses

From novice to tech pro — start learning today.