2014-11-04 71 views
0

我正在使用一些遺留代碼,它在將聚合保存到數據庫時發生中斷。來自SQL服務器的錯誤是着名的'SqlDateTime溢出。必須在1/1/1753之間......等'如何從NHibernate異常中獲取更新SQL語句?

我的問題是:是否有可能問NHibernate框架什麼SQL執行冒泡這個異常?通過這種方式,我將可以輕鬆找到POCO所需要解決的問題。

是否有可能將一個監聽器附加到NHibernate的IDbCommand或其他東西?

下面這樣的異常的例子堆棧跟蹤:

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM. StackTrace: at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc, Boolean sync, TaskCompletionSource`1 completion, Int32 startRpc, Int32 startParam) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) 
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
    at System.Data.SqlClient.SqlCommandSet.ExecuteNonQuery() 
    at NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps) 
    at NHibernate.AdoNet.AbstractBatcher.ExecuteBatchWithTiming(IDbCommand ps) 
    at NHibernate.AdoNet.AbstractBatcher.ExecuteBatch() 
    at NHibernate.AdoNet.AbstractBatcher.PrepareCommand(CommandType type, SqlString sql, SqlType[] parameterTypes) 
    at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) 
    at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) 
    at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session) 
    at NHibernate.Action.EntityUpdateAction.Execute() 
    at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) 
    at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) 
    at NHibernate.Engine.ActionQueue.ExecuteActions() 
    at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) 
    at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) 
    at NHibernate.Impl.SessionImpl.Flush() 
    at NHibernate.Transaction.AdoTransaction.Commit() 
    at Haddock.Business.Services.CommonRepositoryBase`3.SaveOrUpdate(TRootAggregate rootAggregate) in d:\Builds\4\Haddock\Haddock.Releases.P44-2014.SL\Sources\Business\Haddock.Business.Services\CommonRepositoryBase.cs:line 140 
... 

我想加入一些額外的檢查代碼到CommonRepositoryBase類,它是用來在整個項目。

下面的代碼,這實際上是完全可以理解的:

ISession session = GetSession(); 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      try 
      { 
       session.SaveOrUpdate(rootAggregate); 
       transaction.Commit(); // does a flush internally 
      } 
      catch (Exception) 
      { 
       transaction.Rollback(); 
       throw; 
      } 
     } 

那麼,我的目標爲是具有在catch塊一些代碼,檢查會話和交易是在使用和擴展NHibernate希望執行的SQL語句異常。

回答

1

您可以在SQL Server Management Studio中使用SQL Server Profiler來跟蹤正在數據庫上運行的查詢。

只需在複製bug之前啓動分析器,就可以從那裏看到執行的查詢。

從查詢

除了轉儲,你還可以看到類似的執行時間等,爲你的答案

+1

感謝執行的查詢的詳細信息,這是正確的,我們有時會使用SQL事件探查對我們的開發/分期系統。但是..當然這個問題似乎只發生在我們無法運行SQL Profiler的實時系統上。我認爲它可能是系統/ nhibernate的一個很好的補充,如果它告訴你它正在嘗試執行它自己的sql語句而不運行一個profiler ;-) – Hace 2014-11-04 09:34:51