【问题标题】:How to insert, update or delete after DataReader.Read?DataReader.Read 后如何插入、更新或删除?
【发布时间】:2012-09-19 23:47:38
【问题描述】:

当我从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读取时无法访问数据库,如何解决?

【问题讨论】:

    标签: vb.net sqldatareader datareader


    【解决方案1】:

    通常,一个连接只支持一个并发操作;因此,如果您想使用单个连接,一种方法是先缓冲数据(到某种列表或表中),然后在内存中迭代列表,使用连接执行更新。

    根据数据库供应商/版本,您可能能够启用“MARS”(多个活动结果集) - 这是一种在同一连接上启用多个命令的技术。例如,在 SQL Server 上,这是通过将连接字符串更改为包括:

    MultipleActiveResultSets=True
    

    第三种选择是使用两个连接;一个用于读取操作,一个用于更新 - 但是请注意,这可能会遇到连接之间的阻塞(也可能是死锁)问题。

    但是,第四个也是最首选的选项是:不要为了更新而通过网络提取数据。如果可能,在 SQL 中编写一个基于批处理的操作,直接执行更改而无需离开数据库,然后执行该 SQL 脚本。

    【讨论】:

    • 非常感谢先生,我尝试使用mars但我使用mysql并且mysql不支持mars,
    • @StefenWiranata 确实,在 mysql 上,您无法使用该选项。不过,对于不同数据库产品的其他读者来说,值得一提。
    • 我使用 2 个连接,它解决了问题,但它允许死锁或错误?
    【解决方案2】:

    打开一个新连接,或使用不会阻塞连接的技术,例如数据适配器/数据表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      相关资源
      最近更新 更多