代码之家  ›  专栏  ›  技术社区  ›  Page

sqldataadapter.dispose是否实际关闭关联的sqlconnection?

  •  9
  • Page  · 技术社区  · 17 年前

    有人知道sqldataadapter.dispose方法是否实际关闭或释放了任何sqlconnections吗?我加载了Reflector,看到了sqldataadapter继承自dbdataadapter。如果我分解并查看该类中的Dispose方法,则似乎没有任何SQLConnections的处置。我想我可以为此写一个测试,但我想我会问是否有人对此有任何见解。

    3 回复  |  直到 14 年前
        1
  •  10
  •   Joel Coehoorn    14 年前

    首先要注意的是,在某些情况下,DataAdapter确实会管理并关闭您的连接。例如,如果您使用的是DataAdapter,那么您可能正在使用.fill()和.update()函数对数据表/数据集进行操作。

    .Fill() docs :

    与select语句关联的连接对象必须有效,但不需要打开它。如果在调用fill之前关闭了连接,则会打开连接以检索数据,然后关闭连接。如果在调用fill之前连接已打开,则它将保持打开状态。

    这个 .Update() docs 完全不要提及任何关于连接的内容,所以我希望需要手动管理它。

    现在您特别询问了dispose()方法。就像更新一样, Dispose() docs 不要特别提到连接,所以我希望需要手动关闭它。

    最后,我们可以像这样稍微改进Bob King的代码:

    Using conn as New SqlConnection(""), _
          adapter as New SqlDataAdapter() With {.Connection = conn}
        'Do stuff
    End Using
    

    或在C中:

    using (SqlConnection conn = new SqlConnection(""))
    using (SqlDataAdapter adapter = new SqlDataAdapter() {Connection = conn})
    {
        // Do stuff
    }
    

    不是100%我获得了适配器权限的初始化语法,但我直接将其键入了应答窗口。如果需要的话,我稍后会修好的。

        2
  •  1
  •   Bob King    17 年前

    据我所知,事实并非如此。我使用嵌套的using语句来实现这一点,首先创建连接,然后创建适配器,作为using语句“pop”,适配器被释放,然后连接被释放,这是 触发关闭:

    Using conn as New SqlConnection("")
        Using adapter as New SqlDataAdapter() With {.Connection = conn}
            'Do stuff'
        End Using
    End Using
    

    如果您选择的语言是C,那么C的语法实际上是相同的。

        3
  •  0
  •   Mehrdad Afshari    17 年前

    不,它不会处理连接。我认为不应该。你可能想在别处使用它。

    推荐文章