数据源和连接背后的代码是否需要在使用后关闭?

时间:2016-05-12 19:08:17

标签: vb.net

数据源后面的代码和/或连接需要在databind()之后关闭吗?我的代码是vb.net

    Dim conn As SqlConnection = New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("DefaultDataBaseServer").ConnectionString)
    conn.Open()
    Dim sql As String = lblConcept.Text.Replace("@xxxxxx", xxxxxID.Value)
    Dim myCommand As SqlCommand = New SqlCommand(sql, conn)
    ckConceptList.DataSource = myCommand.ExecuteReader()
    ckConceptList.DataBind()

2 个答案:

答案 0 :(得分:3)

does a code behind datasource and/or a connection need to be closed after databind()

术语“代码隐藏”和DataBind()暗示这与某些Web技术有关,但没有任何此类标记。

一般情况下,任何具有Dispose()方法的东西都表明它可能会分配一些不仅应该关闭的资源,而且Disposed也可以释放这些资源。

未配置的笔,画笔和位图等图形对象可以(将!)最终引发臭名昭着的“GDI +中的通用错误”异常。但是,诸如Connections和Command对象之类的数据库对象未被遮挡可能会导致您的应用程序泄漏。 This question正在For Loop中创建新的DBCommand对象而不处理它们并遇到系统资源超出异常。

NET Using块(C#中的using())使得关闭和处理这些东西变得简单。以下还将说明如何在SQL上使用参数而不是String.Replace()

Dim SQL = "SELECT a, b, c FROM SomeTable WHERE Foo = @name"
Dim dt As New DataTable
Using dbcon As New MySqlConnection(MySQLConnStr)
    Using cmd As New MySqlCommand(sql, dbcon)

        cmd.Parameters.Add("@name", MySqlDbType.Text).Value = lblConcept.Text

        dbcon.Open()
        dt.Load(cmd.ExecuteReader())
        dgv2.DataSource = dt
    End Using         ' dispose of cmd
End Using             ' dispose of dbcon
  • String.Replace不会像Carol's Cookie Shoppe
  • 那样防止像嵌入式滴答这样简单的事情
  • Parameters.Add()允许您指定数据类型,并在将其留给VB进行猜测时避免数据类型错误

Using声明(Dim)一个新变量并初始化它,因此在同一范围内不能有其他dbConcmd个变量。它还会创建一个新的块范围:那些目标变量和在其中声明的任何内容将是该块的本地变量。以上声明了块外的数据表,因此可以在别处使用。您可以堆叠或组合Using以减少缩进,如下所示:

Using dbcon As New MySqlConnection(MySQLConnStr),
    cmd As New MySqlCommand(sql, dbcon)

    dbcon.Open()
    dt.Load(cmd.ExecuteReader())
    dgv2.DataSource = dt

End Using

VB编辑器对此有点古怪 - 在完成并关闭块之前,intellisense不会帮助dbcon的{​​{1}}变量参数。

更多信息:

Connection Pooling 描述了.NET如何最大限度地降低创建DBConnections的成本。

<强> Using Statement (Visual Basic) 即可。从中引用:

  

有时,您的代码需要非托管资源,例如文件句柄,COM包装器或SQL连接。使用块可确保在代码完成后处理一个或多个此类资源。这使得它们可供其他代码使用。

IDisposable (通常)是实现cmd方法的方式。备注非常值得一读。

Avoiding Problems with the Using Statement 解释了将Dispose块与Try/Catch语句组合在一起的原因和原因。这里还有很多帖子描述了如何在各种情况下结合使用这两者。

<强> How do I create a parameterized SQL query? Why Should I?

答案 1 :(得分:1)

你应该使用try catch,最后。

body {text-align:center;}