- PR -

エラーの対処方法

投稿者投稿内容
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-01-11 11:13
はじめまして。
VB.NETを使用しWinアプリを作成しております。
DBはオラクルです。
画面に検索条件を入れ、結果を同じページにGrapeCityのEl Tabelle MultiRow4.0JのMultiRowSheetにて表示させています。
検索条件のところは入力テキストボックスとサブ画面用ボタンと検索ボタンが配置されていて、サブ画面用ボタンを押すとサブ画面が表示されます。
サブ画面はDLL化したものを使用しており、そこで選択したものを検索画面に表示させています。
検索条件のテキストボックスに値を入れ検索ボタンを押すと検索結果は表示されます。
しかしサブ画面ボタンをクリックし選択後検索ボタンを押すとエラーが出ます。
エラーは
「オブジェクトの現在の状態に問題があるため、操作は有効ではありません。」
です。
色々調べてみたのですが、どこに原因があるかわかりません。
ステップ実行しどこでエラーが出ているか見てみると、検索実行のところのようです。
サブ画面に関しては選択後Diposeしているし、検索実行のところも初期化を行っています。
そもそもこのエラーの意味がわからなくて困っています。
ヒントになることでも結構ですので、どなたか教えていただけませんか??
よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-01-11 12:18
引用:

ふらわーさんの書き込み (2008-01-11 11:13) より:

検索条件のところは入力テキストボックスとサブ画面用ボタンと検索ボタンが配置されていて、サブ画面用ボタンを押すとサブ画面が表示されます。
サブ画面はDLL化したものを使用しており、そこで選択したものを検索画面に表示させています。
検索条件のテキストボックスに値を入れ検索ボタンを押すと検索結果は表示されます。
しかしサブ画面ボタンをクリックし選択後検索ボタンを押すとエラーが出ます。


??? な、何が何だかわからない・・・ のですが、どうやら最後の 1 行以前は仕様の説明のようですね。(間違っていましたらご指摘ください)

引用:

エラーは
「オブジェクトの現在の状態に問題があるため、操作は有効ではありません。」
です。
色々調べてみたのですが、どこに原因があるかわかりません。


遷移までのコードがないとアドバイスしようがないので、現象が再現できる最小限のコードの提示をお願いします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-01-11 13:04
わかりにくくて申し訳ありません。
書き直します。

[画面仕様]
画面に検索条件を入れ、結果を同じページにGrapeCityのEl Tabelle MultiRow4.0JのMultiRowSheetにて表示させています。
検索条件のところは入力テキストボックスとサブ画面用ボタンと検索ボタンが配置されていて、サブ画面用ボタンを押すとサブ画面が表示されます。
サブ画面はDLL化したものを使用しており、そこで選択したものを検索画面に表示させています。

[結果]
検索条件のテキストボックスに値を入れ検索ボタンを押すと正しい検索結果が表示されます。
しかしサブ画面ボタンをクリックし、選択後検索ボタンを押すとエラーが出ます。

エラーの内容は
「オブジェクトの現在の状態に問題があるため、操作は有効ではありません。」
です。

[コード(抜粋)]
ページロード処理

Dim dr As OracleDataReader
Dim ds As New DS
Dim intCNT As Integer = 0

Try
Dim strSQL As String = GetSQL(SQL.検索) 'SQL取得
Dim Cmd As New OracleCommand(strSQL, DB.DBAccess.DBConnection) 'SQL文セット
dr = DB.DBAccess.SelectReader(Cmd) 'SQL文の実行 ←ここでエラーのようです。
Do While dr.Read
Dim tr As DS.M_SYAINRow
tr = ds.M_SYAIN.NewM_SYAINRow '新しい行の追加
tr.BeginEdit() '編集開始

tr.SYAIN_CD = dr.Item("SYAIN_CD").ToString '社員コード
tr.SYAIN_NM = dr.Item("SYAIN_NM").ToString '社員名
tr.BUMON_NM = dr.Item("BUMON_NM").ToString '部門名(このコードをサブ画面から取得します。表示は部門名だけ)

intCNT = intCNT + 1

tr.EndEdit() '編集終了
ds.M_SYAIN.Rows.Add(tr) '最後にデータセットに追加する
Loop

'描写停止
Me.MrsRESULT.Redraw = False

Catch ex As Exception
Throw ex
'例外処理
MessageBox.Show("データの取得処理に失敗しました。" & vbCrLf & ex.Message, "メニューオブジェクト", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

With Me.MrsRESULT
.DataSource = ds
'表示するテーブルを指定する
.DataMember = "M_SYAIN"
End With

'描写する
Me.MrsRESULT.Redraw = True


サブ画面検索イベント
Dim searchfrm As New サブ画面
Dim resultcheck As DialogResult

resultcheck = searchfrm.ShowDialog

Me.UcTxtOFFICE.Text = searchfrm.strOFFICECD
Me.LblOFFICENM.Text = searchfrm.strOFFICENM

searchfrm.Dispose()

SQL文
Dim strSQL As String = ""
strSQL = ""
strSQL += "SELECT "
strSQL += " A.SYAIN_CD,A.SYAIN_NM,D.BUMON_NM "
strSQL += " FROM M_SYAIN A LEFT JOIN M_SYAIN_KBN B ON "
strSQL += " A.SYAINKBN_CD = B.SYAINKBN_CD "
strSQL += " LEFT JOIN M_SYOZOKU C ON "
strSQL += " A.EIGYO_CD = C.EIGYO_CD "
strSQL += " LEFT JOIN M_BUMON D ON "
strSQL += " A.BUMON_CD = D.BUMON_CD "
strSQL += " ORDER BY A.SYAIN_CD "

DB接続はあらかじめDLL化されているのですが、もしかしたらそれがエラーの原因になっているのか、こちらのコードが悪いのかだけでもわかれば対処方法が見つかるかもしれません。
よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-01-11 13:27
引用:

ふらわーさんの書き込み (2008-01-11 13:04) より:

わかりにくくて申し訳ありません。


ありがとうございます。 とてもわかりやすいです。

引用:

Dim strSQL As String = GetSQL(SQL.検索) 'SQL取得
Dim Cmd As New OracleCommand(strSQL, DB.DBAccess.DBConnection) 'SQL文セット
dr = DB.DBAccess.SelectReader(Cmd) 'SQL文の実行 ←ここでエラーのようです。


ここにある DB.DBAccess.DBConnection と OracleCommand が連携していないと
「オブジェクトの現在の状態に問題があるため、操作は有効ではありません」
という例外になることがあります。

まずは、Connection が null (Nothing) でないか、OracleCommand のインスタンスにある OracleConnection の参照とで一致しているかを確認してみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2008-01-11 13:39
引用:

ふらわーさんの書き込み (2008-01-11 13:04) より:

SQL文
Dim strSQL As String = ""
strSQL = ""
strSQL += "SELECT "
strSQL += " A.SYAIN_CD,A.SYAIN_NM,D.BUMON_NM "
strSQL += " FROM M_SYAIN A LEFT JOIN M_SYAIN_KBN B ON "
strSQL += " A.SYAINKBN_CD = B.SYAINKBN_CD "
strSQL += " LEFT JOIN M_SYOZOKU C ON "
strSQL += " A.EIGYO_CD = C.EIGYO_CD "
strSQL += " LEFT JOIN M_BUMON D ON "
strSQL += " A.BUMON_CD = D.BUMON_CD "
strSQL += " ORDER BY A.SYAIN_CD "


関係ないけど、気になったので。

StringBuilder の方がよくないですか?
細切れにしている理由もよく分かりませんけど(^_^;)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-01-11 13:51
引用:

ひろれいさんの書き込み (2008-01-11 13:39) より:

StringBuilder の方がよくないですか?
細切れにしている理由もよく分かりませんけど(^_^;)


C# なら逐語的リテラル マンセーなんですけどね。 VB では皆さんどのように書いているのでしょうね? 脱線しそうなので別スレッドか Blog か何かで展開してみますか。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-01-11 14:04
じゃんぬねっと様

早速の回答ありがとうございます。

≫まずは、Connection が null (Nothing) でないか、OracleCommand のインスタンスにある OracleConnection の参照とで一致しているかを確認してみてください。

確認してみたところ確かにConnectionがNothingでした。
でもなぜここでNothingになるのかがわかりません。。。

ページロードの際に全検索をして表示し、検索条件を入れて検索ボタンクリックで再表示させています。
ちょっと書き忘れていたことがあります。
ページロード用と検索ボタンクリック用のコードは全く同じですが、別で書いています。

「ページロード」
(先程記載した検索処理)

「ボタンクリック」
(先程記載した検索処理)

こんな感じです。。。

ページロードの処理内容を確認したところ、こちらではConnectionには値が入っていました。しかし検索ボタンクリック処理のところではConnectionがNothingとなっていました。

ページロードと検索ボタンクリックの時に
「Dim Cmd As New OracleCommand(strSQL, DB.DBAccess.DBConnection)」
という同じ処理を行っているというのが悪い原因なのでしょうか??

ページロードの時のConnectionの値を保持したまま、検索ボタンクリックの処理をすればいけるのかなぁと考えましたが、まだやり方がわかっていないので試していません。

それか同じコードを二つ書くのはよくないので、共通で使用できるようにしておこうかと思っています。
一度試してみます。
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-01-11 14:09
ひろれい様

確かにこのプログラム意味不明な箇所がたくさんあります。
誰かが書いたものなのですが、それを参考に書くようにと言われているので直したくても直せません。。。
直してあとで色々言われたらいやなので。

初心者なので偉そうなことは言えませんが、私はStringBuilderしか使ったことがないです。
やっぱりStringBuilderが正当な方法なんですかね??

スキルアップ/キャリアアップ(JOB@IT)