SqlCommand-SqlConnection使用处置问题

马丁

根据MSDN,如果嵌套内部using语句的IDisposable资源包含外部using语句的资源,则嵌套资源的Dispose方法将释放所包含的资源。

MSDN(http://msdn.microsoft.com/en-us/library/ms182334.aspx)=>

示例嵌套using语句(在Visual Basic中使用)可能导致违反CA2202警告。如果嵌套的内部using语句的IDisposable资源包含外部using语句的资源,则嵌套资源的Dispose方法将释放所包含的资源。发生这种情况时,外部using语句的Dispose方法将尝试第二次处置其资源。在以下示例中,在包含流对象的StreamWriter对象的Dispose方法中,在外部using语句的末尾释放在外部using语句中创建的Stream对象。在外部using语句的末尾,第二次释放流对象。第二个版本违反了CA2202。

但是,如果我尝试这段代码,该代码仍然有效,并返回插入表中的数字计数。这与MSDN解释矛盾。我希望代码在cmd.ExecuteScalar()调用时崩溃,因为conn变量位于第一个内部using语句之后。为什么这仍然有效,为什么第一次使用完内部后就不会处理conn变量?

static void Main(string[] args)
{
    var numbers= DoItGetIt();
}

private static int DoItGetIt()
{
    using (var conn = new SqlConnection("Data Source=BestmixSql;Initial Catalog=Test;Integrated Security=True"))
    {
        conn.Open();
        using (var cmd = new SqlCommand())
        {
            cmd.Connection = conn;
            cmd.CommandText = "INSERT INTO [Test].[dbo].[Tabel] VALUES (666)";
            cmd.ExecuteNonQuery();
        }

        using (var cmd = new SqlCommand())
        {
            cmd.Connection = conn;
            cmd.CommandText = "SELECT COUNT(*) FROM [Test].[dbo].[Tabel]";

            var count = cmd.ExecuteScalar();

            return Convert.ToInt32(count);
        }
    }
}
马克·格雷韦尔

您正在谈论的MSDN示例是专门针对内部对象占据外部对象的情况的;例如,StreamWriter可以为承担责任Stream那种情况下,放置内部对象也会导致放置外部对象-但这在通常情况下是不正确的。

特别是,命令不承担处置连接的责任。有趣的是,数据读取器可以承担责任,但只能通过可选标志承担责任。

许多这样的对象提供标志,以使调用者确定内部对象是否应承担处置外部对象的责任。例如,StreamWriter现在还提供了带有bool leaveOpen参数的构造函数重载如果通过as trueStreamWriter不会级联Dispose()

这是所有的内部对象的实现细节,当它被专门编写做到这一点这不是该using模式的默认行为


旁注:我会说MSDN在这里根本是错误的。正确实施是有两个第一样品using第二个示例是非直觉的,并且容易实现错误。不要使用它。如果需要,leaveOpenmake的使用是明确的,但坦率地说,如果您无论如何都要使用它,通常无需使用它就可以正常工作。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从类到SqlCommand的SqlConnection

来自分类Dev

使用SqlCommand和范围

来自分类Dev

是否将为SQLCommand提供新的SQLConnection调用在新的SQL Connection上处置?

来自分类Dev

使用SQLCommand / Connection时使用

来自分类Dev

使用MsTest在C#中模拟SqlConnection,SqlCommand和SqlReader

来自分类Dev

使用SUM()的SqlDataReader和SqlCommand

来自分类Dev

使用C#SqlCommand的动态SQL

来自分类Dev

创建一个使用SqlCommand的类

来自分类Dev

关闭记录集后,是否需要处置SqlCommand?

来自分类Dev

关闭并处理后,SqlConnection / SqlCommand可使数据库保持使用状态

来自分类Dev

“使用”块进行SqlCommand初始化的好处

来自分类Dev

尝试使用C#执行查询时SqlCommand返回错误

来自分类Dev

为什么要使用SqlCommand.CommandType = StoredProcedure?

来自分类Dev

使用sqlcommand在asp.net上检索更新的参数值

来自分类Dev

如何使用c#的SqlCommand获取IDENT_CURRENT结果?

来自分类Dev

如何回滚已使用SqlTransaction执行的所有SqlCommand?

来自分类Dev

没有使用参数化SqlCommand的行

来自分类Dev

为什么使用 SqlCommand 插入语句很慢?

来自分类Dev

使用SqlCommand执行存储过程时,如何防止出现超时错误?

来自分类Dev

如何使用C#在SQL Server中通过SQLCommand插入阿拉伯文本

来自分类Dev

SqlCommand.ExecuteReader使用带输出参数的存储过程不返回任何行

来自分类Dev

在另一个函数中使用SqlCommand时,何时关闭?

来自分类Dev

长时间运行的SP永远不会使用sqlCommand结束

来自分类Dev

SqlCommand.ExecuteReader使用带输出参数的存储过程不返回任何行

来自分类Dev

如何在C#中使用SqlCommand和SqlDataReader返回Json结果

来自分类Dev

如何使用C#在SQL Server中通过SQLCommand插入阿拉伯文本

来自分类Dev

使用 EXECUTE AS 语句和 .NET SqlCommand 运行 t-sql 存储过程

来自分类Dev

如何使用 SqlCommand C# 向 SQL 查询添加静态参数

来自分类Dev

SqlCommand无法创建表

Related 相关文章

  1. 1

    从类到SqlCommand的SqlConnection

  2. 2

    使用SqlCommand和范围

  3. 3

    是否将为SQLCommand提供新的SQLConnection调用在新的SQL Connection上处置?

  4. 4

    使用SQLCommand / Connection时使用

  5. 5

    使用MsTest在C#中模拟SqlConnection,SqlCommand和SqlReader

  6. 6

    使用SUM()的SqlDataReader和SqlCommand

  7. 7

    使用C#SqlCommand的动态SQL

  8. 8

    创建一个使用SqlCommand的类

  9. 9

    关闭记录集后,是否需要处置SqlCommand?

  10. 10

    关闭并处理后,SqlConnection / SqlCommand可使数据库保持使用状态

  11. 11

    “使用”块进行SqlCommand初始化的好处

  12. 12

    尝试使用C#执行查询时SqlCommand返回错误

  13. 13

    为什么要使用SqlCommand.CommandType = StoredProcedure?

  14. 14

    使用sqlcommand在asp.net上检索更新的参数值

  15. 15

    如何使用c#的SqlCommand获取IDENT_CURRENT结果?

  16. 16

    如何回滚已使用SqlTransaction执行的所有SqlCommand?

  17. 17

    没有使用参数化SqlCommand的行

  18. 18

    为什么使用 SqlCommand 插入语句很慢?

  19. 19

    使用SqlCommand执行存储过程时,如何防止出现超时错误?

  20. 20

    如何使用C#在SQL Server中通过SQLCommand插入阿拉伯文本

  21. 21

    SqlCommand.ExecuteReader使用带输出参数的存储过程不返回任何行

  22. 22

    在另一个函数中使用SqlCommand时,何时关闭?

  23. 23

    长时间运行的SP永远不会使用sqlCommand结束

  24. 24

    SqlCommand.ExecuteReader使用带输出参数的存储过程不返回任何行

  25. 25

    如何在C#中使用SqlCommand和SqlDataReader返回Json结果

  26. 26

    如何使用C#在SQL Server中通过SQLCommand插入阿拉伯文本

  27. 27

    使用 EXECUTE AS 语句和 .NET SqlCommand 运行 t-sql 存储过程

  28. 28

    如何使用 SqlCommand C# 向 SQL 查询添加静态参数

  29. 29

    SqlCommand无法创建表

热门标签

归档