1

J'ai construit une procédure stockée qui fait l'équivalent de FOR XML AUTO dans SQL Server 2008. Maintenant que je le teste, il me donne un message d'erreur vraiment inutile. Que signifie cette erreur?L'exécution du framework .NET a échoué lors de l'exécution de la procédure stockée CLR?

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... 

Répondre

3

Je suis assez sûr que cela signifie que vous l'avez fait mal ...

Sur une autre note: On dirait que vous remplissez un datatable. Pendant l'appel, il essaie de convertir quelque chose en valeur de chaîne .. et échoue.

Vous allez devoir regarder les colonnes qui reviennent pour voir s'il y en a une qui ne peut pas être convertie en une représentation sous forme de chaîne. Peut-être une valeur binaire ou nulle, ou quelque chose comme ça.

+3

"Je suis à peu près sûr que cela signifie que vous l'avez mal fait ..." Wow. Je n'aurais jamais compris ça. Je pense que c'est probablement la réponse la plus géniale que j'ai jamais reçue sur stackoverflow. Je dirais quelque chose d'encore plus sarcastique et méchant ici, mais cela ne serait pas productif. Si vous avez une réponse (comme vous l'avez fait, plus tard dans votre message) alors vous devriez l'ajouter sans être un abruti à ce sujet. – bitcycle

+1

Wow. Il s'agissait d'une réponse ironique à la question générale de «voici une erreur, mais je n'ai fourni aucun code ni aucune donnée pour l'accompagner pour donner à quiconque la moindre idée de ce qui aurait pu se passer». petit visage souriant a fait la différence? alléger mec. – NotMe

+1

@Sean Ochoa: [Lighten Up ...] (http://www.youtube.com/watch?v=fiH9yXKSMVM#t=5m2s) – Randolpho

3

Généralement, les exceptions d'interruption de thread se produisant pendant le remplissage de DataSet/Table/Adaptateur ADO.NET se produisent parce que la requête a duré plus longtemps que le délai d'expiration des moyens utilisés pour récupérer les données.

Dans votre cas, il semble que vous utilisiez une connexion SQL Server directe. Par conséquent, essayez de définir la propriété CommandTimeout pour votre commande SQL à une valeur suffisamment grande pour répondre à votre requête. Cela, ou affiner la requête ou même l'architecture de l'application pour de meilleures performances.

+0

J'ai raté l'exception ThreadAbortException la première fois que j'ai lu le vidage de la pile. Votre analyse semble avoir raison. – NotMe

+1

Lors de la définition de la valeur CommandTimeout à une valeur plus grande, considérez également la valeur executionTimeout du thread de demande. Si cela dépasse cette valeur, cela aboutira à une autre threadabortexception. – Sunil