C# 超时异常导致SqlDataReader关闭?
我试图从数据库中提取一些二进制数据,并将它们写入pdf文件。在大多数情况下,这是顺利进行的,但偶尔的数据行似乎抛出了一个特定的错误- 超时已过期。操作完成前已过超时时间,或者服务器没有响应 请记住,这只发生在少数几行上,而不是随机的。相同的行总是抛出异常。我不太清楚为什么会抛出异常,但我可以跳过确实会导致问题的行,然后继续。然而,我的问题是,当我捕获异常并尝试移动到下一行时,我遇到另一个异常- InvalidOperationException-当读卡器关闭时调用读取的尝试无效 这是否意味着读卡器一旦遇到异常就会自动关闭?如果没有任何戏剧,我怎么能继续下一排呢C# 超时异常导致SqlDataReader关闭?,c#,sql,sqldatareader,C#,Sql,Sqldatareader,我试图从数据库中提取一些二进制数据,并将它们写入pdf文件。在大多数情况下,这是顺利进行的,但偶尔的数据行似乎抛出了一个特定的错误- 超时已过期。操作完成前已过超时时间,或者服务器没有响应 请记住,这只发生在少数几行上,而不是随机的。相同的行总是抛出异常。我不太清楚为什么会抛出异常,但我可以跳过确实会导致问题的行,然后继续。然而,我的问题是,当我捕获异常并尝试移动到下一行时,我遇到另一个异常- InvalidOperationException-当读卡器关闭时调用读取的尝试无效 这是否意味着读卡
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);
}
}
堆栈跟踪,根据要求-
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()
如果SQL错误严重性小于17,则可以设置
SqlConnection.FireInfoMessageEventOnUserErrors=true
将异常作为警告处理。无论发生什么情况,任何大于严重性17的命令都会超时。看起来您的SqlCommand
正在超时-当您调用ExecuteReader
时,相关的命令将保持打开状态,并且在您完成读取之前很容易超时。正如文件中所述:
此属性是累积的
期间所有网络读取的超时
命令的执行或处理
结果。超时仍然可能发生
返回第一行后,以及
不包括用户处理时间,
只有网络读取时间
当命令超时时,它会关闭读卡器,您无法从中恢复
要解决这个问题,首先要大幅增加CommandTimeout
,以确保可以继续
接下来,如果您还没有这样做,那么使用ExecuteReader
重载可能会有所帮助,该重载允许您指定CommandBehavior
,并传递CommandBehavior.SequentialAccess
(根据MSDN主题中的建议)
最后,您还可以尝试将读取的内容分成多个记录块。事实证明,我所需要的只是增加超时时间(请注意,我必须将超时时间增加到10分钟左右)。我提取的一些文档非常庞大!谢谢;)