【问题标题】:.NET framework execution aborted while executing CLR stored procedure?.NET 框架执行在执行 CLR 存储过程时中止?
【发布时间】:2010-05-04 19:44:09
【问题描述】:

我在 SQL Server 2008 中构造了一个相当于 FOR XML AUTO 的存储过程。现在我正在测试它,它给了我一个非常无用的错误消息。这个错误是什么意思?

Msg 10329, Level 16, State 49, Procedure ForXML, Line 0 .NET Framework execution was aborted.

System.Threading.ThreadAbortException: Thread was being aborted.

System.Threading.ThreadAbortException:

  at System.Runtime.InteropServices.Marshal.PtrToStringUni(IntPtr ptr, Int32 len)
  at System.Data.SqlServer.Internal.CXVariantBase.WSTRToString()
  at System.Data.SqlServer.Internal.SqlWSTRLimitedBuffer.GetString(SmiEventSink sink)
  at System.Data.SqlServer.Internal.RowData.GetString(SmiEventSink sink, Int32 i)
  at Microsoft.SqlServer.Server.ValueUtilsSmi.GetValue(SmiEventSink_Default sink, ITypedGettersV3 getters, Int32 ordinal, SmiMetaData metaData, SmiContext context)
  at Microsoft.SqlServer.Server.ValueUtilsSmi.GetValue200(SmiEventSink_Default sink, SmiTypedGetterSetter getters, Int32 ordinal, SmiMetaData metaData, SmiContext context)
  at System.Data.SqlClient.SqlDataReaderSmi.GetValue(Int32 ordinal)
  at System.Data.SqlClient.SqlDataReaderSmi.GetValues(Object[] values)
  at System.Data.ProviderBase.DataReaderContainer.CommonLanguageSubsetDataReader.GetValues(Object[] values)
  at System.Data.ProviderBase.SchemaMapping.LoadDataRow()
  at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
  at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
  at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
  at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
  at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
  at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
  at ForXML.GetXML...

【问题讨论】:

    标签: .net exception stored-procedures sqlclr threadabortexception


    【解决方案1】:

    我很确定这意味着你做错了......

    另一方面:看起来您正在填充数据表。在通话期间,它试图将某些内容转换为字符串值..并且失败了。

    您将不得不查看返回的列,以查看是否存在无法转换为字符串表示形式的列。可能是二进制或空值,或类似的东西。

    【讨论】:

    • “我很确定这意味着你做错了......”哇。我永远也想不通。我认为这可能是我曾经在 stackoverflow 上收到的最棒的答案。我会在这里说一些更讽刺和更刻薄的话,但这不会有成效。如果您有答案(正如您所做的那样,稍后在您的帖子中),那么您应该添加它而不是混蛋。
    • 哇。这是对“这里有一个错误,但我没有提供任何代码或数据来为任何人提供关于可能发生的事情的线索”的一般问题的半开玩笑的回应。小笑脸有什么不同吗?放轻松,伙计。
    【解决方案2】:

    在 ADO.NET 数据集/表/适配器填充期间发生的典型线程中止异常是因为查询运行的时间超过了用于检索数据的任何方法的超时时间。

    在您的情况下,您似乎使用的是直接 SQL Server 连接,所以我会说尝试将您的 SQL 命令的 CommandTimeout 属性设置为足够大的值以适应您的查询。或者微调查询甚至应用程序架构以获得更好的性能。

    【讨论】:

    • 我第一次读取堆栈转储时错过了 ThreadAbortException。您的分析看起来是正确的。
    • 在将 CommandTimeout 值设置为更大的值时,还要考虑请求线程的 executionTimeout 值。如果超过了这个值,就会导致另一个线程异常终止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多