2009-11-12 24 views
8

Bir veritabanından bazı ikili verileri almayı ve bunları pdf dosyalarına yazmayı deniyorum. Çoğunlukla, bu yüzme boyunca devam ediyor, ancak ara sıra veri satırı belirli bir hata atıyor gibi görünüyor -Zaman aşımı istisnası SqlDataReader'ın kapanmasına neden oluyor mu?

Zaman aşımı süresi doldu. İşlemin tamamlanmasından önce zaman aşımı süresi doldu veya sunucu yanıt vermiyor.

Unutmayın, bu sadece birkaç satırda gerçekleşir ve asla rastgele olmaz. Aynı satırlar her zaman istisnayı atar. Özel durumun neden atıldığından emin değilim, ama sorunlara yol açan ve devam eden satırları atladım. Benim sorunum, ancak, istisna yakalamak ve sonra bir sonraki satıra geçmek için deneyin, ben başka bir özel durum içine girmeye çalıştığım -

InvalidOperationException - Okuyucu kapalı olduğunda okumaya çalışmak için geçersiz girişimi.

Bu, okuyucu bir istisna haline gelir gelmez otomatik olarak kapanacağı anlamına mı geliyor? Herhangi bir drama olmadan bir sonraki sıraya geçmeye nasıl giderim? istendiği gibi

 while (sdrReader.Read()) // Second exception happens here 
     { 
      try 
      { 
       byte[] byteData = new Byte[(sdrReader.GetBytes(0, 0, null, 0, int.MaxValue))]; // first exception happens here 
       sdrReader.GetBytes(0, 0, byteData, 0, byteData.Length); 
       string strOutputFileName = sdrReader.GetInt32(1).ToString() + ".pdf"; 
       msMemoryStreams = new MemoryStream(); 
       msMemoryStreams.Write(byteData, 0, byteData.Length); 
       byte[] byteArray = msMemoryStreams.ToArray(); 

       msMemoryStreams.Flush(); 
       msMemoryStreams.Close(); 

       writeByteArrayToFile(byteData, txtFilesPath.Text + "\\" + strOutputFileName); 
      } 
      catch (Exception e) 
      { 
       Logger.Write("Document failed to convert: " + e.Message); 
      } 
     } 

Yığın izleme, - SQL Hata Önem az 17 ise

at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 
    at System.Data.SqlClient.TdsParserStateObject.ReadBuffer() 
    at System.Data.SqlClient.TdsParserStateObject.ReadByteArray(Byte[] buff, Int32 offset, Int32 len) 
    at System.Data.SqlClient.TdsParser.ReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, Int32 length, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.ReadColumnData() 
    at System.Data.SqlClient.SqlDataReader.ReadColumn(Int32 i, Boolean setTimeout) 
    at System.Data.SqlClient.SqlDataReader.GetSqlBinary(Int32 i) 
    at System.Data.SqlClient.SqlDataReader.GetBytesInternal(Int32 i, Int64 dataIndex, Byte[] buffer, Int32 bufferIndex, Int32 length) 
    at System.Data.SqlClient.SqlDataReader.GetBytes(Int32 i, Int64 dataIndex, Byte[] buffer, Int32 bufferIndex, Int32 length) 
    at Pdf2Rtf.Form1.Read() in F:\Code\Pdf2Rtf\Pdf2Rtf\Pdf2Rtf\Form1.cs:line 77 
    at Pdf2Rtf.Form1.btnRead_Click(Object sender, EventArgs e) in F:\Code\Pdf2Rtf\Pdf2Rtf\Pdf2Rtf\Form1.cs:line 24 
    at System.Windows.Forms.Control.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
    at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
    at System.Windows.Forms.Button.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.Run(Form mainForm) 
    at Pdf2Rtf.Program.Main() in F:\Code\Pdf2Rtf\Pdf2Rtf\Pdf2Rtf\Program.cs:line 18 
    at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

cevap

12

SqlCommand zaman aşımına uğramış gibi görünüyor - ExecuteReader numaralı telefonu aradığınızda, ilgili komut açık kalıyor ve okumayı bitirene kadar zaman aşımlarına karşı savunmasız kalacaktır. o SqlCommand.CommandTimeout belgelerinde söylediği gibi: tüm ağ sonuçların komut yürütme veya işleme sırasında okur için

Bu özellik kümülatif zaman aşımı olduğunu. İlk satırın döndürülmesinden sonra bir zaman aşımı ortaya çıkabilir ve yalnızca kullanıcı işlem süresi, yalnızca ağ okuma süresini içermez.

dışarı komut süreleri, bu kurtaramazsınız hangi okuyucu, kapatır.

Bunu çözmeyi denemenin ilk yolu, devam edebilmeniz için sadece CommandTimeout değerini arttırmaktır.

Sonraki Daha önce yapmadıysanız, bu size bir CommandBehavior belirlemenizi sağlar ExecuteReader aşırı kullanmak için yardımcı olabilir ve (MSDN konu "Retrieving Large Data (ADO.NET) "in önerisi başına) CommandBehavior.SequentialAccess geçmesi .

Son olarak, okuyucuyu kayıt parçalarına bölmeyi de deneyebilirsiniz.

+0

Tüm ihtiyacım olan zaman aşımını azaltmak oldu (aklı, siz 10 dakikaya kadar arttırmak zorunda kaldım). Çıkarıyorum dev! Teşekkür ederim;) – Paulie

1

, bir uyarı olarak istisna işlemek için SqlConnection.FireInfoMessageEventOnUserErrors = true ayarlayabilirsiniz. Ne olursa olsun, Severity 17'den daha büyük bir şey close the connection'a gidiyor.