3

から読み取るときにデータベースを更新する必要があるプロジェクトがあります。この接続で既に開かれているため、最初に閉じる必要がありますDataReaderDataReader

これが私のコードです:

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、修正するにはどうすればよいですか?

4

2 に答える 2

2

通常、接続は1つの同時操作のみをサポートします。したがって、単一の接続を使用する場合、1つのアプローチは、最初にデータを(ある種のリストまたはテーブルに)バッファリングしてから、接続を使用して更新を実行し、メモリ内のリストを反復処理することです。

データベースのベンダー/バージョンによっては、「MARS」(複数のアクティブな結果セット)を有効にできる場合があります。これは、同じ接続で複数のコマンドを有効にするテクノロジです。たとえば、SQL Serverでは、接続文字列を次のように変更することでアクティブになります。

MultipleActiveResultSets=True

3番目のオプションは、2つの接続を使用することです。1つは読み取り操作用で、もう1つは更新用です。ただし、これにより、接続間のブロック(および場合によってはデッドロック)の問題が発生する可能性があることに注意してください。

ただし、4番目の最も好ましいオプションは次のとおりです。更新を行うためだけにネットワーク経由でデータをプルしないでください。可能であれば、データベースを離れることなく直接変更を実行するバッチベースの操作をSQLで記述し、そのSQLスクリプトを実行するだけです。

于 2012-09-20T08:21:36.223 に答える
1

新しい接続を開くか、dataadapter/datatableなどの接続をブロックしないテクノロジーを使用します。

于 2012-09-20T00:36:16.940 に答える