这是访问数据库的功能;连接字符串是完美的 - 还有另一个与此类似的函数,它工作正常。
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 :(得分: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()。