即使connection.open存在,表示连接关闭 - 删除时尝试阻止尝试阻止
这是访问数据库的功能;连接字符串是完美的 - 还有另一个类似于这个功能,它工作正常。即使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
试试这个:
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
只是要小心,因为异步代码可以从你现在可以隐藏例外。
这工作完美!谢谢 –
请更换ExecuteNonQueryAsync()与ExecuteNonQuery()。
这不是他想要的所有注意函数的返回类型是一个'任务' –
问题在于,正如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
您可能需要添加一些错误里面的任务处理和清理它了一点,但应该给你一个起点。
它显示连接已关闭? –
你不小心打电话Connection.Open(),而不是connection.Open()(注意套管!) – Mino
我称之为功能的地方 –