当我从DataReader
读取时,我有一个项目需要更新数据库,它说DataReader
已经在这个连接上打开,必须首先关闭。
这是我的代码:
Try
conn = fOpenConnection()
cmd = conn.CreateCommand
queryjadi = "select *..."
cmd = New MySqlCommand(queryjadi, conn)
dbReader = cmd.ExecuteReader
While dbReader.Read
For Each lvi In lsvBOM.Items
If dbReader("kode") = lvi.Text.ToString Then
**'here i want to update my database**
End If
Next
End While
dbReader.Close()
queryjadi = "SELECT * ... "
cmd = New MySqlCommand(queryjadi, conn)
dbReader = cmd.ExecuteReader
For Each lvi In lsvBOM.Items
status = False
While dbReader.Read
If dbReader("kode") = lvi.Text Then
status = True
End If
End While
If status = False Then
'untuk insert
**'here i want to insert into database**
End If
Next
MessageBox.Show("Data sudah disimpan", "Informasi", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
Catch sqlEx As MySqlException
fSQLError(sqlEx.Number, sqlEx.Message)
Catch ex As Exception
MessageBox.Show(ex.Message, "Kesalahan", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
Finally
dbReader.Close()
cmd.Dispose()
conn.Close()
End Try
我知道我从DataReader
读取时无法访问数据库,如何修复它?
通常,一个连接只支持一个并发操作;因此,如果您想使用单个连接,一种方法是先缓冲数据(到某种列表或表中),然后在内存中迭代列表,使用连接执行更新。
根据数据库供应商/版本的不同,您可能能够启用"MARS"(多个活动结果集)-这是一种在同一连接上启用多个命令的技术。例如,在SQL Server上,这是通过将连接字符串更改为包含:来激活的
MultipleActiveResultSets=True
第三种选择是使用两个连接;一个用于读取操作,另一个用于更新-但是,请注意,这可能会遇到连接之间的阻塞(可能还会出现死锁)问题。
然而,第四个也是最受欢迎的选择是:不要仅仅为了更新而通过网络获取数据。如果可能的话,在SQL中编写一个基于批处理的操作,直接执行更改而不离开数据库,然后只执行该SQL脚本。
打开一个新的连接,或者使用不阻塞连接的技术,比如数据适配器/数据表。