0

我有一个我负责维护的业务应用程序,并且关于在其中创建新评论时不断弹出这个间歇性错误。我终于得到了一个导致它的确切字符串,并且在慢慢地将文本段落缩小到导致它的确切部分之后,我已经将它缩小到了最基本的组件。但除了在各处使用创可贴之外,我没有任何解决办法。我想看看这是否是一个常见问题,并可能得到一些反馈。

我正在使用 Fluent nHibernate (1.3.0.773) 和 nHibernate (3.3.1.400),我也剥离了我的映射文件,所以请确保这不是因为我可以得到它并且仍然重现错误(并具有功能正常的构建)。这是用于FluentMappings.ExportTo()转储配置时的注释结果内容。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class xmlns="urn:nhibernate-mapping-2.2" name="Core.Comment, Core, Version=5.0.4720.19853, Culture=neutral, PublicKeyToken=null" table="tblComments">
    <id name="CommentId" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="CommentId" />
      <generator class="guid.comb" />
    </id>
    <property name="OwnerId" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="OwnerId" />
    </property>
    <property name="Text" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Description" />
    </property>
  </class>
</hibernate-mapping>

非常简单,但是如果要提交的文本中有一个撇号,然后是单词 update 后跟一个右括号,那么ArgumentOutOfRangeException当我尝试提交事务时会出现错误。

以下字符串导致问题

  • Lorem ipsum dolor sit amet, consectetur。(这个不更新)
  • 也不更新)
  • '更新)

这些不会导致问题

  • Lorem ipsum dolor sit amet, consectetur。(这确实更新)
  • 更新)
  • '更新
  • '更新)

您可以提供的任何见解都会很棒。

更新: 我应该提到,当我将 nHibernate Profiler 连接到这个时,没有生成与插入新记录相关的 SQL。所以我假设它来自nHibernate内部的某种逻辑?

堆栈跟踪

[ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index]
   System.ThrowHelper.ThrowArgumentOutOfRangeException() +72
   System.Collections.Generic.List`1.get_Item(Int32 index) +34
   NHibernate.AdoNet.Util.FormatProcess.CloseParen() +141
   NHibernate.AdoNet.Util.FormatProcess.Perform() +452
   NHibernate.AdoNet.Util.BasicFormatter.Format(String source) +67
   NHibernate.AdoNet.SqlClientBatchingBatcher.AddToBatch(IExpectation expectation) +310
   NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) +914
   NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session) +341
   NHibernate.Action.EntityInsertAction.Execute() +371
   NHibernate.Engine.ActionQueue.Execute(IExecutable executable) +48
   NHibernate.Engine.ActionQueue.ExecuteActions(IList list) +128
   NHibernate.Engine.ActionQueue.ExecuteActions() +35
   NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) +156
   NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) +180
   NHibernate.Impl.SessionImpl.Flush() +295
   NHibernate.Transaction.AdoTransaction.Commit() +189
   Web.Filters.NHibernateActionFilter.OnActionExecuted(ActionExecutedContext filterContext) in c:\Development\[Project Folder]\Web.Controllers\Filters\NHibernateActionFilter.cs:82
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +354
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +323
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +323
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +44
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +139
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +74
   System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +68
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +184
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +136
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +66
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +40
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +151
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +68
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +151
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +65
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +45
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +151
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +66
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9629708
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
4

2 回答 2

0

好的,所以我发现了导致它的原因。一旦我从我的项目中删除了 nHibernate Profiler 的初始化,错误就停止发生了。它一定是在执行它之前尝试格式化字符串以进行记录 - 因为它爆炸了,它从来没有真正执行查询。我错了,日志记录应该吞下错误,或者至少不要让它干扰正常操作。

更新:使用 nHibernate Profiler 2 时会出现同样的问题,但只要我注释掉NHibernateProfiler.Initialize(),问题就会消失。去看看能不能得到开发商的支持。请注意,您实际上不必使用 nHibernate Profiler 附加您的进程,只需初始化分析器就足以导致问题。我试图在 12 月 5 日通过电子邮件联系 nHibernate Profiler 支持,但还没有收到任何回复,所以我不知道这是否已经被查看过。

于 2012-12-04T18:27:31.170 回答
0

由于这是我在网上搜索确切的错误消息时弹出的首要问题之一,我认为这对人们了解我如何修复它会有所帮助。

问题中提到的错误堆栈跟踪实际上是由 NHibernate 的 BasicFormatter 抛出的。在 NHibernate 的 GitHub 存储库中,有一个针对此错误的记录问题。这是链接 - https://github.com/nhibernate/nhibernate-core/issues/1319

在撰写此答案时,该错误已在最新的 NHibernate 中得到修复。对于旧版本,例如 3.1.0(我遇到错误时正在使用的版本),在文件中将format_sql属性设置为 false可以解决问题。nhibernate.config

于 2021-09-18T06:53:37.497 回答