数据源后面的代码和/或连接需要在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()
答案 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
Carol's Cookie Shoppe
Parameters.Add()
允许您指定数据类型,并在将其留给VB进行猜测时避免数据类型错误 Using
声明(Dim
)一个新变量并初始化它,因此在同一范围内不能有其他dbCon
或cmd
个变量。它还会创建一个新的块范围:那些目标变量和在其中声明的任何内容将是该块的本地变量。以上声明了块外的数据表,因此可以在别处使用。您可以堆叠或组合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;}