我知道这个问题可能是重复的问题,但是我有一个问题,需要解决方案来解决。
我已经创建了一个项目,并在所有地方都使用了功能和Sub。
其中一个功能/子就像
Public Sub ExecuteQuery(Xcn As OleDbConnection)
Try
If Xcn.State = ConnectionState.Open Then Xcn.Close()
Xcn.Open()
cmd.Connection = Xcn
cmd.ExecuteNonQuery()
Xcn.Close()
Catch e As Exception
Throw e
End Try
End Sub
我只使用executequery(con)
而不是每次都写完整的句子。
现在的问题是,我创建了一个bw_worker并运行一个子程序,其中包括异步显示的小子程序。
例如,A sub是我像这样运行异步,
Private Sub RunCode()
dim cmd as new oledbcommand("Select * from table",con)
if con.state = ConnectionState.closed then con.open()
execute reader stuff here
if con.state = ConnectionState.Open then con.close()
ExecuteQuery(con)
cmd = new Oledbcommand("Select * from Table2",con)
ExecuteQuery(con)
End Sub
我不知道它的良好做法,但是现在出现了问题。
我试图创建一个加载屏幕,以便花一些时间获取功能和辅助功能,因此我引用了Link并遇到了错误。
注意:,我了解它所带来的错误,但如果可能的话,我想知道一种解决方法。就像无需更改大量代码的可能。
答案 0 :(得分:1)
如果将数据库对象放在本地,则不会在另一个线程上打开它们。命令也一样。此代码将演示如何使用Using块,即使有错误,该块也将关闭并处置数据库对象。请不要.AddWithValue。 .Add方法强制您命名数据类型,这将有助于直观地提供传入的数据类型匹配的线索。还有一些使用.Add的数据库原因。参见https://www.dbdelta.com/addwithvalue-is-evil/和https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/
可以在连接字符串中使用类级别的变量,这样您就不必一直输入它。
Private ConnString As String = "Your connection string"
Private Sub RunCode()
Using con As New OleDbConnection(ConnString)
Using cmd As New OleDbCommand("Select * from table", con)
con.Open()
Using reader = cmd.ExecuteReader
'reader stuff here
End Using
End Using
End Using
End Sub