【问题标题】:Shows connection is closed even if connection.open is present - Works when I remove Try Block即使存在 connection.open 也显示连接已关闭 - 当我删除 Try Block 时有效
【发布时间】:2017-10-13 14:09:31
【问题描述】:

这是访问数据库的函数;连接字符串是完美的 - 还有另一个类似的功能,它工作正常。

Friend Shared Function AddMember(member As Object) As Task(Of Integer)
    Dim connection = New SqlConnection(Configuration.ConfigurationManager.ConnectionStrings("Carrel").ConnectionString)
     Dim query = New SqlCommand("INSERT INTO JSON (CATEGORY,DATA) VALUES ('MEM',@JSONString)", connection)
        Try
            Connection.Open()
            query.Parameters.Add(New SqlParameter("@JSONString", JsonConvert.SerializeObject(member)))
            Return query.ExecuteNonQueryAsync()
        Catch ex As Exception
            MsgBox(ex.ToString())
            Throw
        Finally
            query.Connection.Close()
        End Try
    End Function

【问题讨论】:

  • 在哪里显示连接已关闭?
  • 你是不是不小心调用了 Connection.Open(),而不是 connection.Open()(注意大小写!)
  • 我调用这个函数的地方
  • 不,大小写不起作用。
  • 你确定吗? VB.Net 允许混合大小写——它不区分大小写。但它是区分大小写的,Visual Studio 通常会更正一个仅区分大小写与声明的名称...除非您有两个仅区分大小写的名称,比如变量名和类型名相同,或者局部变量和成员变量相同。 Visual Studio 没有将Connection 自动更正为connection,这表明您可能存在命名冲突。

标签: sql sql-server vb.net


【解决方案1】:

试试这个:

Friend Shared Async Function AddMember(member As Object) As Task(Of Integer)
    Dim cn AS New SqlConnection(Configuration.ConfigurationManager.ConnectionStrings("Carrel").ConnectionString)
    Dim query As New SqlCommand("INSERT INTO JSON (CATEGORY,DATA) VALUES ('MEM',@JSONString)", cn)
    Try
        cn.Open()
        query.Parameters.Add(New SqlParameter("@JSONString", JsonConvert.SerializeObject(member)))
        Return Await query.ExecuteNonQueryAsync()

    Catch ex As Exception
        MsgBox(ex.ToString())
        Throw
    Finally
        query.Connection.Close()
    End Try
End Function

这应该会阻止方法继续越过ExecuteNonQueryAsync() 行,直到任务返回,因此连接将保持打开状态,但仍可以运行而不会阻塞。

将连接和命令对象放在Using 块中也是更好的做法,并且不必担心此级别的异常。这是一种数据访问方法......将其与您的演示代码分开。让异常在调用代码中冒泡,尤其是在 Async 方法中:

Friend Shared Async Function AddMember(member As Object) As Task(Of Integer)
    Using cn AS New SqlConnection(Configuration.ConfigurationManager.ConnectionStrings("Carrel").ConnectionString), _
          cmd As New SqlCommand("INSERT INTO JSON (CATEGORY,DATA) VALUES ('MEM',@JSONString)", cn)

        query.Parameters.Add(New SqlParameter("@JSONString", JsonConvert.SerializeObject(member)))
        cn.Open()

        Return Await query.ExecuteNonQueryAsync()

    End Using
End Function

请小心,因为异步代码现在可能会对您隐藏异常。

【讨论】:

    【解决方案2】:

    问题在于,正如 Aman Bachas 所说,您正在调用 ExecuteNonQueryAsync 它将在后台启动操作。但是你的 finally 块将在执行实际发生之前执行并关闭连接。

    您需要做的是调用非 Async 版本,然后执行您自己的 Async,以便在完成后关闭连接。

        Public Function AddMember(member As Object) As Threading.Tasks.Task(Of Integer)
    
            Dim connection = New SqlConnection(Configuration.ConfigurationManager.ConnectionStrings("Carrel").ConnectionString)
            Dim query = New SqlCommand("INSERT INTO JSON (CATEGORY,DATA) VALUES ('MEM',@JSONString)", connection)
            Try
                connection.Open()
                query.Parameters.Add(New SqlParameter("@JSONString", JsonConvert.SerializeObject(member)))
                Return Threading.Tasks.Task.Factory.StartNew(Of Integer)(Function()
                                                                             Dim ret = query.ExecuteNonQuery()
                                                                             connection.Close()
                                                                             Return ret
                                                                         End Function)
            Catch ex As Exception
                MsgBox(ex.ToString())
                Throw
            End Try
        End Function
    

    您可能希望在任务中添加一些错误处理并稍微清理一下,但这应该为您提供一个起点。

    【讨论】:

      【解决方案3】:

      请将 ExecuteNonQueryAsync() 替换为 ExecuteNonQuery()。

      【讨论】:

      • 这根本不是他想要的。注意函数的返回类型是Task
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2020-12-26
      • 1970-01-01
      • 2021-07-21
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多