0

我有以下代碼在exe中工作,甚至可以在CLR中的小型xml文件上工作,但一旦它們變得大於10mb,就會發生線程流產錯誤。有什麼我需要在SQL Server中配置?CLR存儲過程線程異常

Try 

    sStream = HttpRequest.GetRequestStream() 
    sStream.Write(baByteArray, 0, baByteArray.Length) 
    sStream.Close() 
    wrWebResponse = HttpRequest.GetResponse() 
    sStream = wrWebResponse.GetResponseStream() 
    Dim readStream As New StreamReader(sStream, System.Text.Encoding.UTF8) 
    strXmlResponse = readStream.ReadToEnd() ' Errors out here 
    strXmlResponseDoc.LoadXml(strXmlResponse) 
    wrWebResponse.Close() 
    sStream.Close() 
    readStream.Close() 

Catch ex As Exception 

    SqlContext.Pipe.Send(ex.ToString()) 
    clsE.LogError(ex.ToString()) 

End Try 

錯誤消息:

System.Threading.ThreadAbortException: Thread was being aborted. 
at System.Threading.Thread.AbortInternal() 
at System.Threading.Thread.Abort(Object stateInfo) 
at System.Data.SqlServer.Internal.ClrLevelContext.CheckSqlAccessReturnCode(SqlAccessApiReturnCode eRc) 
at System.Data.SqlServer.Internal.ClrLevelContext.SendMessageToPipe(String message, SmiEventSink eventSink) 
at Microsoft.SqlServer.Server.SqlPipe.Send(String message) 
at MacCLR.MacClass.RequestXml(String strXmlToSend) 
at MacCLR.StoredProcedures.ProcessShippingXML_1(String iOrderNumb, String iXmlFilePath, String iXmlFileName, SqlInt32& iResult, SqlString& iResult_String) 
+0

是的。這是一個CLR存儲過程在.NET中 – Somejerk

+0

酷。我添加了一個.NET語言標記,它應始終是SO上的主要標記。謝謝。 – Gray

+1

請勿從SQLCLR下載文件。從外部執行.exe –

回答

0

在爲每個IDisposable接口放入一個使用塊後,我仍然收到一個錯誤信息,但這讓我意識到它是一個32位的SQL Server安裝,並且從我讀的內容中處理CLR內存的方式不同於64位。使用; -g384啓動參數至少可以對錯誤進行綁定,直到我可以實現更強大的解決方案。謝謝您的幫助。

0

每個對象創建一個實現IDisposable接口需要在Using塊。無論是否有例外情況,都可以確保對象得到及時清理。這包括兩個流,WebResponse和StreamReader。

這對於在SQL Server進程內部運行的代碼尤其重要。

+0

我打算把代碼放在一個使用區塊中,但它似乎很奇怪,它可以在〜1mb的文件上正常工作。 – Somejerk

+1

這並不奇怪。您正在耗盡在垃圾收集週期之前不會被處置的資源,即使這些資源也是如此。資源越大,問題越多。 –