I&#039;m confused between two aspects of error handling. The first one is trapping for a concurrency error as follows: <BR><BR>Public Function SaveData(ByVal daSQL As SqlDataAdapter, ByVal drArray() As DataRow, ByVal objUpdateType As UpdateType, ByVal strAppName As String, ByRef intRecordsAffected As Integer, ByRef dsUpdErrors As DataSet) As Boolean <BR><BR>Try <BR>&#039;Select what type of processing occurs in case of an UPDATE failure <BR>SelectSQLUpdateType(objUpdateType, daSQL) <BR><BR>&#039;Update the Datarow <BR>daSQL.Update(drArray) <BR><BR>&#039;Records that had errors during the UPDATE <BR>dsUpdErrors = dsErrors <BR><BR>&#039;# of records affected against the DataAdapter for any INSERT, UPDATE or DELETE statements <BR>intRecordsAffected = intUpdRecordsAffected <BR>SaveData = True <BR>Catch dbcx As DBConcurrencyException <BR>SaveData = False <BR>Dim clsLogEntry As New LogDALEntry() <BR>clsLogEntry.LogMessage(dbcx.Message(), dbcx.Source, dbcx.StackTrace, dbcx.GetType.ToString, strAppName, EventLogEntryType.Warning) <BR>clsLogEntry = Nothing <BR>Throw (dbcx) <BR><BR>Catch exException As Exception <BR>SaveData = False <BR>Dim clsLogEntry As New LogDALEntry() <BR>clsLogEntry.LogMessage(exException.Message() , exException.Source, exException.StackTrace, exException.GetType.ToString, strAppName, EventLogEntryType.Error) <BR>clsLogEntry = Nothing <BR>Throw (exException) <BR><BR>Finally <BR>&#039;Clean up objects no longer needed <BR>drArray = Nothing <BR>daSQL.Dispose() <BR>dsErrors = Nothing <BR>End Try <BR><BR>Return SaveData <BR><BR>End Function <BR><BR><BR>On the "Catch dbcx As DBConcurrencyException", my error is passed back up to the presentation tier where I can process the error with some business logic. <BR><BR>The other aspect is in the "SelectSQLUpdateType(objUpdateType, daSQL)" line of the above code. This code creates an error handler procedure if the "daSQL.Update(drArray)" statement encounters an error as follows depending on how the error is to be processed: <BR><BR>Private Sub OnRowSQLContinue(ByVal sender As Object, ByVal args As SqlRowUpdatedEventArgs) <BR>If (args.StatementType = StatementType.Update) And (args.RecordsAffected = 0) Then <BR>args.Status = UpdateStatus.SkipCurrentRow <BR>args.Row.RowError = args.Errors.Message <BR>&#039; Add code to reconcile the error. <BR>End If <BR>intUpdRecordsAffected = args.RecordsAffected <BR>End Sub <BR><BR>From what I understand, when the Update statement executes, all of the INSERT, DELETE & UPDATE statements belonging to the specific dataadapter execute inside the above code. Is the above code used for any error except for a concurrency issue? Because the args.RecordsAffected is almost sure to be greater than 0 if processing many rows within a dataset, so it will never get inside the "If" statement. Also, if an error occurs inside this "If" statment, how do I actually reconcile the error. I&#039;m really confused about this? Any help would be greatly appreciated.... <BR><BR><BR><BR>--------------------------------------------------------------------------------<BR>Thanks, <BR><BR>Bill Yeager, BCIP