SqlDataReader挂在Dispose()上

那个父亲

我使用以下方法对数据库执行查询并读取数据:

using(SqlConnection connection = new SqlConnection("Connection string"))
{
    connection.Open();

    using(SqlCommand command = new SqlCommand("SELECT * FROM TableName", connection))
    {
        using (SqlDataReader reader = command.ExecuteReader())
        {
              // read and process data somehow (possible source of exceptions)
        } // <- reader hangs here if exception occurs
    } 
}

在读取和处理数据时,可能会发生一些异常。问题是DataReaderClose()调用中引发异常时挂起您有什么想法吗???以及如何以适当的方式解决这个问题?当我写try..catch..finally块而不是在放置阅读器之前using调用时,问题消失了command.Cancel()finally

工作版本:

    using(SqlConnection connection = new SqlConnection("Connection string"))
    {
        connection.Open();

        using(SqlCommand command = new SqlCommand("SELECT * FROM TableName", connection))
        {
            SqlDataReader reader = command.ExecuteReader();
            try
            {
                // read and process data somehow (possible source of exceptions)
            }
            catch(Exception ex)
            {
                // handle exception somehow
            }
            finally
            {
               command.Cancel(); // !!!
               reader.Dispose();
            }
        } 
    }
usr

发生异常时,您将在接收所有数据之前停止处理数据。如果您在几行后中止处理,则即使没有异常,也可以重现此问题。

放置命令或阅读器后,查询仍在服务器上运行。ADO.NET只会读取所有剩余的行和结果集(例如mad),然后将其丢弃。这样做是因为服务器正在发送它们,而协议要求接收它们。

调用SqlCommand.Cancel将“注意”发送到SQL Server,导致查询真正终止。这与在SSMS中按“取消”按钮相同。

总结来说,尽管有更多行入站,但无论何时停止处理行,都会发生此问题。您的解决方法(称为SqlCommand.Cancel)是正确的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java进程挂在IOUtils上。疑似死锁

来自分类Dev

SqlDataReader挂在Dispose()上

来自分类Dev

Powershell Get-EventLog挂在RemoteComputer上

来自分类Dev

Git push挂在大型存储库上

来自分类Dev

Vagrant挂在Windows 7上

来自分类Dev

挂在getEnumeration()上的JMS QueueBrowser

来自分类Dev

应用程序似乎挂在SocketRead上

来自分类Dev

Image.FromFile()或FromStream()挂在GdiplusStartup上

来自分类Dev

packaged_task挂在operator()上

来自分类Dev

挂在某些库上的“去获取”

来自分类Dev

视频记录挂在IMFSinkWriter-> Finalize()上;

来自分类Dev

Android Studio挂在“每日提示”上

来自分类Dev

Xcode挂在“编译Swift源文件”上

来自分类Dev

Shell脚本挂在awk命令上

来自分类Dev

Ubuntu挂在紫色屏幕上

来自分类Dev

Ubuntu挂在紫色屏幕上

来自分类Dev

Debian Jessie挂在引导上

来自分类Dev

HTTPResponse挂在多个请求上

来自分类Dev

DOMDocument挂在丢失的图像上

来自分类Dev

GDB永远挂在Solaris上

来自分类Dev

DBAN挂在PCI(sysfs)上

来自分类Dev

openSUSE挂在引导上

来自分类Dev

挂在Gnome电源按钮上

来自分类Dev

挂在nextInt()上的基本程序

来自分类Dev

lldb挂在Alpine Linux上

来自分类Dev

OkHTTPClient挂在Multipart请求上

来自分类Dev

Gradle 挂在 transformClassesWithPreDexForRelease 上

来自分类Dev

挂在 If 语句上的 EggPlant 脚本

来自分类Dev

Passportjs 挂在 serializeUser 上