The code generated by the three stored procedures call another stored procedure ErrorHandler. The reason that I did not include the ErrorHandler as a stored procedure is that this procedure is customized for every project. ErrorHandler is supposed to translate the error into a human readable message. Below is a very simplistic ErrorHandler: CREATE PROCEDURE ErrorHandler @error_number integer, @table_name sysname, @action sysname AS declare @message varchar ( 100 ), @error_string varchar ( 10 ), @error_message varchar ( 255 ) select @message = 'Error %s record in %s. ' if @action = 'adding' or @action = 'updating' begin if @error_number = 2627 select @message = @message + 'Duplicate code entered.' if @error_number = 547 select @message = @message + 'Constraint error. Please check the data entered.' if @error_number = 532 select @message = @message + 'Data has been changed by another user.' end if @action = 'deleting' begin if @error_number = 547 select @message = @message + 'Code is being referenced by another table.' end exec master..xp_sprintf @error_message output, @message, @action, @table_name raiserror ( @error_message, 18, 1 ) go This should show you how to write your own ErrorHandler procedure. You can even send your own error number and set a proper error message here. Ideally, there should be a procedure at the front-end which will parse the error messages from the back-end and show a proper message. Below is a quick and dirty VB function sample for RDO (I hope this works). Please don't comment on the use of GOSUB (old habits die hard ). Public Function DecodeSQLErrorMessage() As String Const source$ = "[SQL Server]" Dim i% Dim msg$, strMsg$ Dim rderr As rdoError Dim ary1 As Variant, ary2 As Variant Dim intStartPos%, intStopPos% For i = 0 To rdoErrors.Count - 1 Set rderr = rdoErrors(i) If InStr(rderr.Description, source) <> 0 Then GoSub DECODE_ERROR End If Next If strMsg = "" Then For i = 0 To rdoErrors.Count - 1 Set rderr = rdoErrors(i) strMsg = strMsg & vbCrLf & rderr.Description Next End If DecodeSQLErrorMessage = strMsg Exit Function DECODE_ERROR: msg$ = rderr.Description intStartPos = InStr(msg, source) + Len(source) Select Case rderr.Number Case 547 ary1 = Array(" statement conflicted with ", " constraint '", _ "'. The conflict occurred in database '", "', table '", "', ", " '", "'") ary2 = Array("Statement : ", "Error Type : ", "Constraint : ", "Database : ", "Table : ", "Object Type : ", "Object Name : ") For i = LBound(ary1) To UBound(ary1) intStopPos = InStr(intStartPos + 1, msg$, ary1(i)) If intStopPos <> 0 Then strMsg = strMsg & vbCr & ary2(i) & Mid$(msg$, intStartPos, intStopPos - intStartPos) intStartPos = intStopPos + Len(ary1(i)) End If Next Erase ary1 Erase ary2 Case 2627 ary1 = Array(" constraint '", _ "': Attempt to insert duplicate key in object '", "'.") ary2 = Array("Error Type : ", "Constraint : ", "Table : ") For i = LBound(ary1) To UBound(ary1) intStopPos = InStr(intStartPos + 1, msg$, ary1(i)) If intStopPos <> 0 Then strMsg = strMsg & vbCr & ary2(i) & Mid$(msg$, intStartPos, intStopPos - intStartPos) intStartPos = intStopPos + Len(ary1(i)) End If Next Erase ary1 Erase ary2 Case Else strMsg = strMsg & vbCr & Mid(msg, intStartPos) & vbCr End Select Return End Function Hope this info helped. Maybe some one can spend time on building this further using by using pattern matching and also build something for ADO. Any corrections, suggestions and comments are welcome as I havn't had the time to test the stuff. :-) Hemant Sahgal hemant@irissoftware.com