开发者

How to catch SqlException in LINQ to SQL

In my WPF application, I'm using LINQ to SQL, so when I call SubmitChanges(), it throws an exception, but I'm unable to catch it.

Here is the relevant code:

try
{
    FeatureDataContext.Features.InsertOnSubmit(newFeature);
    FeatureDataContext.SubmitChanges();
}
catch (SqlException sqlEx)
{
    System.Windows.MessageBox.Show("CreateNewFeature : " + sqlEx.Message);
}

And this is the exception which the above throws:

Exception Info: System.Data.SqlClient.SqlException
Stack:
   at System.Data.Linq.DataContext.SubmitChanges(System.Data.Linq.ConflictMode)
   at System.Data.Linq.DataContext.SubmitChanges()
   at [....]

How to catch the SqlException in WPF application?

I saw that SubmitChanges() doesn't throw any exception. But the code which raised exception points to is the code which calls SubmitChanges().


EDIT:

The full exception is this:

Application: CompositeApplicationLauncher.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Data.SqlClient.SqlException
Stack:
   at System.Data.Linq.DataContext.SubmitChanges(System.Data.Linq.ConflictMode)
   at System.Data.Linq.DataContext.SubmitChanges()
   at Runaware.Wpf.CompositeApplication.SessionReviewer.SessionDataProvider.CreateNewCategory(Runaware.InsightAnalysis.ApplicationFeatures.ObjectModel.ApplicationInfo)
   at Microsoft.Practices.Composite.Presentation.Commands.DelegateCommand`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Execute(System.__Canon)
   at Microsoft.Practices.Composite.Presentation.Commands.DelegateCommand`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].System.Windows.Input.ICommand.Execute(System.Object)
   at Runaware.Wpf.CompositeApplication.Commands.DelegateExecute.ExecuteCaller(System.Object, System.Windows.RoutedEventArgs)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(System.Object, System.Windows.RoutedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean)
   at System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject, System.Windows.RoutedEventArgs)
   at System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs)
   at System.Windows.Controls.MenuItem.InvokeClickAfterRender(System.Object)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   at MS.Internal.Threadin开发者_如何学JAVAg.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object)
   at System.Threading.ExecutionContext.runTryCode(System.Object)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   at System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
   at System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
   at System.Windows.Threading.Dispatcher.Run()
   at System.Windows.Application.RunDispatcher(System.Object)
   at System.Windows.Application.RunInternal(System.Windows.Window)
   at System.Windows.Application.Run(System.Windows.Window)
   at System.Windows.Application.Run()
   at Runware.Wpf.CompositeApplication.App.Main()


If the the the try-catch block you provided is inside the CreateNewCategory (looking at the stacktrace) method and the type of the exception being thrown is actually SqlException, then it should be caught.

Alternatively, if you want to catch all exceptions in the applications, you need to subscribe to the Application.DispatcherUnhandledException event for exceptions in the UI thread and AppDomain.CurrentDomain.UnhandledException for exceptions in other threads.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜