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

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

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

Re[2]: Oracleエラー


(過去ログ 71 を表示中)

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

■41372 / inTopicNo.1)  Oracleエラー
  
□投稿者/ ぼいぼい (1回)-(2009/09/18(Fri) 16:10:22)

分類:[VB.NET/VB2005 以降] 

開発言語はVisualBasic.NET 2005です。

処理としては、ActiveReportを開いたときに、Oracleからデータを読み込んで
そのデータをAccessのテーブルに更新するという内容の処理をしたいのですが、
このように書いた場合、データが増えると

「ORA-01000: 最大オープン・カーソル数を超えました。」

というエラーメッセージが出てしまいます。

どこが間違っているか教えていただけると助かります。よろしくお願いします。

↓コード↓
Public Class フォーム名

Private Sub Form_ReportStart(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.ReportStart

'コネクションを指定
OleCnn = New OleDb.OleDbConnection()
OleCnn.ConnectionString = "Provider=" & My.Settings.Provider & "; " _
& "Data Source=" & My.Settings.OleDataSource & ""

OraCnn = New OracleConnection()
OraCnn.ConnectionString = "User Id=" & My.Settings.UserId & "; " _
& "Password=" & My.Settings.Password & "; " _
& "Data Source=" & My.Settings.OraDataSource & ""
'コネクションを開く
OleCnn.Open()
OraCnn.Open()

Try

'コマンドの実行(内容→t_RKS_SHIP_FILEの該当するデータを読み込む)
OleSQL1 = "SELECT IMPID, PROC_BAR FROM t_RKS_SHIP_FILE WHERE LIST_ISS_FLG = '" & 0 & "'"
OleCmd1 = New OleDb.OleDbCommand(OleSQL1, OleCnn)
OleRead1 = OleCmd1.ExecuteReader()

While OleRead1.Read()

'コマンドの実行(内容→SIK_FILE0から該当するデータを読み込む)
OraSQL1 = "SELECT SC_AMT FROM SIK_FILE0 WHERE PROC_BAR = '" & OleRead1.GetValue(1) & "'"
OraCmd1 = New OracleCommand(OraSQL1, OraCnn)
OraRead1 = OraCmd1.ExecuteReader()

While OraRead1.Read()

'コマンドの実行(内容→t_RKS_SHIP_FILEのデータを更新)
OleSQL2 = "UPDATE t_RKS_SHIP_FILE SET SC_AMT = '" & OraRead1.GetValue(0) & "' " _
& "WHERE PROC_BAR = '" & OleRead1.GetValue(1) & "'"
OleCmd2 = New OleDb.OleDbCommand(OleSQL2, OleCnn)
OleCmd2.ExecuteNonQuery()

End While

'コマンドの実行(内容→PARTS_MST0から該当するデータを読み込む)
OraSQL2 = "SELECT PARTS_NO1, GRP_NO FROM PARTS_MST0 " _
& "WHERE COMPANY_NO = '" & Microsoft.VisualBasic.Left(OleRead1.GetValue(1), 5) & "'"
OraCmd2 = New OracleCommand(OraSQL2, OraCnn)
OraRead2 = OraCmd2.ExecuteReader()

While OraRead2.Read()

'コマンドの実行(内容→t_RKS_SHIP_FILEのデータを更新)
OleSQL3 = "UPDATE t_RKS_SHIP_FILE SET PARTS_NO1 = '" & OraRead2.GetValue(0) & "', " _
& "GRP_NO = '" & OraRead2.GetValue(1) & "' " _
& "WHERE PROC_BAR LIKE '" & Microsoft.VisualBasic.Left(OleRead1.GetValue(1), 5) & "%'"
OleCmd3 = New OleDb.OleDbCommand(OleSQL3, OleCnn)
OleCmd3.ExecuteNonQuery()

End While

End While

OraRead1.Close()
OraRead2.Close()
OleRead1.Close()



OleSQL4 = "SELECT GRP_NO, LEFT(PROC_BAR, 5) AS COMPANY_NO, MID(PROC_BAR, 6, 5) AS SHIBAN, " _
& "RIGHT(PROC_BAR, 1) AS NEN, PARTS_NO1, SC_AMT FROM t_RKS_SHIP_FILE " _
& "WHERE LIST_ISS_FLG = '" & 0 & "' AND DELI_CD = '" & Format(1, "00") & "'"
OleCmd4 = New OleDb.OleDbCommand(OleSQL4, OleCnn)
OleRead1 = OleCmd4.ExecuteReader()

Me.DataSource = OleRead1

Catch ex As Exception

'エラー内容をログにはき出す
CRT_LOG("→rist_Seki", "rist_Seki_ReportStart時", ex.ToString(), 2)
MessageBox.Show("エラーが発生しました。再度処理して下さい。", "エラー", _
MessageBoxButtons.OK, MessageBoxIcon.Error)

End Try

End Sub

'行番号集計用の変数
Dim detailCounter As Integer = 0

Private Sub Detail_Format(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Detail.Format

detailCounter += 1

txtNO.Value = Format(detailCounter, "000")

End Sub

Private Sub rist_Seki_ReportEnd(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles MyBase.ReportEnd

OleRead1.Close()
OleCnn.Close()
OraCnn.Close()

End Sub

End Class
引用返信 編集キー/
■41385 / inTopicNo.2)  Re[1]: Oracleエラー
□投稿者/ Jitta on the way (440回)-(2009/09/18(Fri) 18:04:54)
2009/09/18(Fri) 18:06:21 編集(投稿者)

No41372 (ぼいぼい さん) に返信

Start と End のイベントは、必ず対で発生するのでしょうか。

<del>そうでなくても</del>そうだとしても、Connection は、開いたメソッドで閉じましょう。

引用返信 編集キー/
■41387 / inTopicNo.3)  Re[1]: Oracleエラー
□投稿者/ はつね (1076回)-(2009/09/18(Fri) 18:13:11)
はつね さんの Web サイト
No41372 (ぼいぼい さん) に返信
> そのデータをAccessのテーブルに更新するという内容の処理をしたいのですが、
> このように書いた場合、データが増えると
>
> 「ORA-01000: 最大オープン・カーソル数を超えました。」
>
> というエラーメッセージが出てしまいます。


OleCommandをどんどんNewするだけでDisposeしてないようですけど。
UsingとEnd Using使って管理した方がいいじゃないかなー?

引用返信 編集キー/
■41392 / inTopicNo.4)  Re[1]: Oracleエラー
□投稿者/ もりお (87回)-(2009/09/18(Fri) 19:32:27)
2009/09/18(Fri) 19:43:19 編集(投稿者)
No41372 (ぼいぼい さん) に返信
> 「ORA-01000: 最大オープン・カーソル数を超えました。」
> 
> というエラーメッセージが出てしまいます。

ループの中で ExecuteReader() を呼び出しているようですが
Close() の呼び出しはループの外で1回だけとなっているようです。
ExecuteReader() を呼び出した回数分 Close() は呼ばなければいけないです。

こちらも Using を使うとわかりやすいです。

Do While OleRead1.Read()
    Using OraRead1 = OraCmd1.ExecuteReader()
        Do While OraRead1.Read()
            ...    
        Loop
        OraRead1.Close()
    End Using
    ...
Loop


SqlDataReader だと DataReader が既に開かれていますよーとエラーが出るのですが
プロバイダーによっては新しい接続を開くのかしら

引用返信 編集キー/
■41394 / inTopicNo.5)  Re[2]: Oracleエラー
□投稿者/ たくボン (199回)-(2009/09/18(Fri) 19:53:25)
No41392 (もりお さん) に返信
> 2009/09/18(Fri) 19:43:19 編集(投稿者)
>
> ■No41372 (ぼいぼい さん) に返信
>>「ORA-01000: 最大オープン・カーソル数を超えました。」

> SqlDataReader だと DataReader が既に開かれていますよーとエラーが出るのですが
> プロバイダーによっては新しい接続を開くのかしら

Oracleの場合はどうだったかなぁ。
単純にOPEN_CURSORSの値が少ないなら、増やせばいいと思うけど、ソース見る限りそういう問題でもなさそうですね。
OraCnnやOleRead1がメンバに見えないけど、モジュールとかで宣言してるんじゃないですよね?DataReaderは高速だけど、コネクションやカーソルの制御があるからインスタンスの管理ができないならDataTableでも良いと思う。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -