2017-10-13 60 views
-3

这是访问数据库的功能;连接字符串是完美的 - 还有另一个类似于这个功能,它工作正常。即使connection.open存在,表示连接关闭 - 删除时尝试阻止尝试阻止

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 
+0

它显示连接已关闭? –

+3

你不小心打电话Connection.Open(),而不是connection.Open()(注意套管!) – Mino

+0

我称之为功能的地方 –

回答

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块中并且不用担心此级别的异常也是更好的做法。这是一种数据访问方法...将它从您的演示代码中分离出来。让调用代码异常泡了,尤其是在一个异步方法:

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 

只是要小心,因为异步代码可以从你现在可以隐藏例外。

+0

这工作完美!谢谢 –

-1

请更换ExecuteNonQueryAsync()与ExecuteNonQuery()。

+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 

您可能需要添加一些错误里面的任务处理和清理它了一点,但应该给你一个起点。