即使存在connection.open,也显示连接已关闭 - 当我删除Try Block时工作

时间:2017-10-13 14:09:31

标签: sql sql-server vb.net

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

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

3 个答案:

答案 0 :(得分:0)

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

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

    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

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

答案 1 :(得分:0)

试试这个:

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 :(得分:-1)

请用ExecuteNonQuery()替换ExecuteNonQueryAsync()。