C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 最大オープン・カーソル数を超えましたのエラーについて


(過去ログ 172 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■98953 / inTopicNo.1)  最大オープン・カーソル数を超えましたのエラーについて
  
□投稿者/ H-H-K (1回)-(2022/01/21(Fri) 16:42:52)

分類:[.NET 全般] 

開発環境
Windows10Pro 20H2
VisualBasic2012
Oracle12c
open_cursors=300

500件程度のデータがある「TEST_TABLE」を全検索し、
1件ずつ「TEST_ADD_TABLE」へデータ追加する以下のコードを実行すると(1回のSQLで実行可能ですがあえて1件ずつ)、
[Oracle][ODBC][Ora]ORA-01000: 最大オープン・カーソル数を超えました。のエラーとなってしまいます(300件目くらい)
トランザクション処理で、繰り返しInsert文を発行する場合、
設定されているオープンカーソル数を超えるデータ件数は扱えないのでしょうか?
それともクローズする方法があるのでしょうか?
何か方法があれば教えて頂けるとありがたいです。
宜しくお願い致します。

ソース
※Try Catch・RollbackTrans等の処理は省いて記載しています

Dim DB As ADODB.Connection

Private Sub TEST()
	Dim Rs     As ADODB.Recordset
	Dim Sql    As String

	DB = New ADODB.Connection()
        DB.Open("DSN=TEST_SERV;USER ID=TEST_USER/PASS")

	Rs = New ADODB.Recordset
	DB.BeginTrans()

	Sql = "Select A, B, C From TEST_TABLE"
	
	Rs.Open(Sql, DB)
        
	Do While Rs.EOF = False
		Sql = "Insert Into TEST_ADD_TABLE(A, B, C)"
		Sql = Sql & "Values"
		Sql = Sql & "("
		Sql = Sql & "'" & Rs("A").Value & "',"
		Sql = Sql & "'" & Rs("B").Value & "',"
		Sql = Sql & "'" & Rs("C").Value & "'"
		Sql = Sql & ")"

		DB.Execute(Sql)

		Rs.MoveNext()
	Loop
	Rs.Close()

	DB.CommitTrans()
	DB.Close()
End Sub

引用返信 編集キー/
■98955 / inTopicNo.2)  Re[1]: 最大オープン・カーソル数を超えましたのエラーについて
□投稿者/ shu (1269回)-(2022/01/21(Fri) 17:05:41)
No98953 (H-H-K さん) に返信

とりあえず
ADODBではなくADO.NET系のクラスを利用した方がよいです。

引用返信 編集キー/
■98957 / inTopicNo.3)  Re[1]: 最大オープン・カーソル数を超えましたのエラーについて
□投稿者/ KOZ (208回)-(2022/01/21(Fri) 19:05:37)
No98953 (H-H-K さん) に返信

.NET では COM オブジェクトの解放はとても面倒です。
Oracle に接続するなら ODP.NET を使いましょう。

「Oracle Data Provider for .NET」
https://www.oracle.com/jp/database/technologies/application-development/dot-net.html

「.NETへの快適なドライブ」
https://www.oracle.com/jp/technical-resources/articles/dotnet/o24odp.html

引用返信 編集キー/
■98958 / inTopicNo.4)  Re[1]: 最大オープン・カーソル数を超えましたのエラーについて
□投稿者/ KOZ (209回)-(2022/01/21(Fri) 21:11:08)
2022/01/22(Sat) 04:43:21 編集(投稿者)

No98953 (H-H-K さん) に返信

ちなみに、なぜエラーが起きるかというと Execute メソッドは Recordset オブジェクトを返すからです。
なので、

Dim o As Object = DB.Execute(Sql)
System.Runtime.InteropServices.Marshal.ReleaseComObject(o)

としてオブジェクトを解放すれば大丈夫です。
引用返信 編集キー/
■99012 / inTopicNo.5)  Re[2]: 最大オープン・カーソル数を超えましたのエラーについて
□投稿者/ H-H-K (2回)-(2022/01/28(Fri) 17:15:17)
shu様

返信頂きありがとうございました。
ADO.NET系を利用するやり方もこれから学んでいこうと思います。

No98955 (shu さん) に返信
> ■No98953 (H-H-K さん) に返信
>
> とりあえず
> ADODBではなくADO.NET系のクラスを利用した方がよいです。
>
引用返信 編集キー/
■99013 / inTopicNo.6)  Re[2]: 最大オープン・カーソル数を超えましたのエラーについて
□投稿者/ H-H-K (3回)-(2022/01/28(Fri) 17:17:31)
KOZ様

返信頂きありがとうございます。
教えて頂いた方法で、オブジェクトを開放したところ、正常に動作するようになりました。
何故、エラーが起こるかの理由までご丁寧に教えて頂き非常に助かりました。

ありがとうございました。

No98958 (KOZ さん) に返信
> 2022/01/22(Sat) 04:43:21 編集(投稿者)
>
> ■No98953 (H-H-K さん) に返信
>
> ちなみに、なぜエラーが起きるかというと Execute メソッドは Recordset オブジェクトを返すからです。
> なので、
>
> Dim o As Object = DB.Execute(Sql)
> System.Runtime.InteropServices.Marshal.ReleaseComObject(o)
>
> としてオブジェクトを解放すれば大丈夫です。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -