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.
精彩评论