【问题标题】:VB.net Variable Scope and SQL ReaderVB.net 变量范围和 SQL 阅读器
【发布时间】:2014-02-04 05:48:37
【问题描述】:

我创建了一个处理 SQL 查询的对象。实际处理查询的函数是:

Function Execute_Command(ByVal strSQLCommand As String)

    Dim sqlReturnInfo As SqlDataReader
    Dim sqlQuery As New SqlCommand

    sqlQuery = sqlMainDBCon.CreateCommand()
    sqlQuery.CommandText = strSQLCommand
    sqlReturnInfo = sqlQuery.ExecuteReader

    Return sqlReturnInfo
End Function

当我第一次执行代码时它工作正常,但第二次我收到一个错误,说 sqlReturnInfo 没有关闭。

我通过在声明之后将 sqlReturnInfo = Nothing 放在顶部来解决问题。

我的理解是,一旦这个函数完成,sqlReturnInfo 应该超出范围并自动销毁,然后一旦函数再次运行,sqlReturnInfo 就会重新创建为一个新对象,因此 sqlReturnInfo = nothing 不应该是必需的/

我在我的代码中的一两个其他区域也看到了这种类型的问题,超出范围的变量持续存在......

是我做错了什么,还是我对变量作用域的理解不正确?

谢谢 -RW

【问题讨论】:

  • 并非所有对象都遵循该规则,无论您使用何种方法,都应在完成后丢弃。使用/结束使用块是最好的 - 它会为您处理。

标签: sql sql-server vb.net visual-studio-2010


【解决方案1】:

Garbage Collection - 并非所有对象都遵循该规则(COM 对象、流、图形对象、字体、位图(最差的)等...),无论您使用什么方法(子/功能),都应在完成后处理.使用/结束使用块是最好的 - 它会为您处理。我的经验法则是,如果您在类对象上看到 Dispose 方法 - 使用它! 他们拥有它们的原因是工程师知道收集它会有问题,因此他们制作了一种方法来帮助它.

您的对象上有以下声明:

You must explicitly call the Close method when you are through using the SqlDataReader to use the associated SqlConnection for any other purpose.

【讨论】:

  • 好的,我想我明白了...我只是在对象声明中声明了 SqlDataReader,然后创建了另一个函数来关闭它。然后在它返回 sqlReturnInfo 之后,下一行运行 close_connection 函数。现在似乎可以工作了。
【解决方案2】:

完成后需要使用 .Close() 函数:

sqlReturnInfo.Close()

见:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.close%28v=vs.110%29.aspx

【讨论】:

    猜你喜欢
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多