Mungkin diantara sahabat djiesoft semua pernah mengalami error :
There is already an open DataReader associated with this Command which must be closed first.
kenapa ini terjadi ? ok, sebelum saya jelaskan saya mempunyai contoh source code :
There is already an open DataReader associated with this Command which must be closed first.
kenapa ini terjadi ? ok, sebelum saya jelaskan saya mempunyai contoh source code :
Dim con As SqlConnection
con = New SqlConnection("data source=.\sql2012;user id=djie;password=123;initial catalog=djiesodt_db;")
con.Open()
Using cmd As New SqlCommand("select * from produk", con)
Using dreader As SqlDataReader = cmd.ExecuteReader
Do While dreader.Read
Using cmd2 AsNew SqlCommand("select * from produk_detail where produk_id='"& dreader("produk_id") & "'", con)
Usingdreader2 As SqlDataReader= cmd2.ExecuteReader
Do Whiledreader2.Read
ListView1.Items.Add(dreader("produk_id").ToString).SubItems.Add(dreader2("produk_id_detail").ToString)
Loop
EndUsing
End Using
Loop
End Using
End Using
Lihatlah ada ExecuteReader didalam ExecuteReader, jadi yang pertama adalah looping Reader dari
"select * from produk", nah selama looping ke semua produk kita juga ingin mengetahui produk detail nya apa saja, maka looping lagi dengan menggunakan ExecureReader lagi dengan dari "select * from produk_detail where produk_id='yg sedang di looping'.
Nah pada saat ExecuteReader yang kedua lah terjadi error diatas, artinya kita tidak bisa melakukan :
1.ExecuteReader jika masih ada ExecuteReader lain yang masih Aktif
2.ExecuteReader di dalam ExecuteReader lain
So, apa solusinya mas pandji??? hehehe. Solusinya minimal ada dua :
1.Kita harus pandai dalam melakukan sql query, karena sebenarnya dari contoh kasus diatas kita bisa lakukan hanya dengan 1 kali looping (1x ExecuteReader) yaitu dengan Sql Query :
SELECT A.PRODUK_ID, B.PRODUK_ID_DETAIL FROM PRODUK AS A JOIN PRODUK_DETAIL AS B ON A.PRODUK_ID=B.PRODUK_B
2.Cara yang paling simple dan mudah adalah dengan menambahkan atribut MultipleActiveResultSets=True pada ConnectionString, jadi connection string-nya menjadi seperti ini :
Tags:
con = New SqlConnection("data source=.\sql2012;user id=djie;password=123;initial catalog=djiesoft_db;MultipleActiveResultSets=True")
Dengan ini tidak perlu mengubah sql query atau mengubah looping. Jadi kesimpulan terakhirnya adalah, selalu gunakan atribut MultipleActiveResultSets=True disetiap connectionString anda agar aman.
Tags:
fix error There is already an open DataReader associated with this Command which must be closed first., tips dan trik mengatasi error There is already an open DataReader associated with this Command which must be closed first., vbnet error There is already an open DataReader associated with this Command which must be closed first.solution of There is already an open DataReader associated with this Command which must be closed first.
0 komentar:
Posting Komentar