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