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

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

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

Re[4]: nowait のエラー


(過去ログ 50 を表示中)

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

■27631 / inTopicNo.1)  nowait のエラー
  
□投稿者/ ニッパー (11回)-(2008/11/11(Tue) 15:24:21)

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

こんにちわ。2008でデータを操作するプログラムを作っているのですが、フォームが2つ存在し、最初のフォームのボタンで2つ目のフォームを表示し、トランザクションとロックを掛け、そのフォームで新規登録を行った後、再び2つ目のフォームを呼び出す再にエラーになってしまいます。
エラー内容としては ORA-00001一意制〜とでるのですが、コミットなどはフォームを閉じるさいに行っているはずなのですがやはりメッセージのとおりなのでしょうか?
ご教授いただけないでしょうか? よろしくお願いします。
↓ソース
フォーム2フォームオープン
        
  strSQL.Connection = cnn
    OraTran = cnn.BeginTransaction()
  Try
        'ロックを開始する
        strSQL.CommandText = "SELECT * FROM テーブル名 FOR UPDATE NOWAIT "
    
        strSQL.ExecuteNonQuery()
    ↑また開くとココでエラー
        '更新と削除の場合
     If the_sender Is Form1.BtnChg Or the_sender Is Form1.DataGridView1 Or the_sender Is Form1.BtnDel Then
            strSQL.CommandText = "コード"

            The_reader = strSQL.ExecuteReader
            The_reader.Read()
            TextBox1.Text = The_reader("名前")
            TextBox2.Text = The_reader("名前")
        End If

↓フォーム2ボタン
'
' 重複チェックなど
'

                strSQL.CommandText = "select count(*) from テーブル"
                The_reader = strSQL.ExecuteReader
                The_reader.Read()
                If The_reader.Item(0) = "0" Then
                    TextBox1.Text = "001"
                Else
                    strSQL.CommandText = "select MAX(UNIT_CD) +1 MAX_CD from テーブル"
                    The_reader = strSQL.ExecuteReader
                    The_reader.Read()

                    '0件以上
                    TextBox1.Text = The_reader("MAX_CD")
                    If CInt(TextBox1.Text) < 10 Then
                        TextBox1.Text = "00" & The_reader("MAX_CD")
                    ElseIf CInt(TextBox1.Text) < 100 Then
                        TextBox1.Text = "0" & The_reader("MAX_CD")
                    End If

                End If

                strSQL.CommandText = "insert into テーブル(名前, 名前) values('" & TextBox1.Text & "' , '" & TextBox2.Text & "')"
                strSQL.ExecuteNonQuery()
                TextBox1.Text = ""
                TextBox2.Text = ""
                TextBox2.Focus()
                One_Rec = True
    
Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        '登録時のみ
        If One_Rec = True Then
            OraTran.Commit() ←ココでかけているはずなのですが・・・。
            OraTran.Dispose()
        Else
            OraTran.Rollback()
            OraTran.Dispose()
        End If

引用返信 編集キー/
■27635 / inTopicNo.2)  Re[1]: nowait のエラー
□投稿者/ HiJun (113回)-(2008/11/11(Tue) 15:54:53)
catchの中ではどのようにしていますか?
引用返信 編集キー/
■27637 / inTopicNo.3)  Re[2]: nowait のエラー
□投稿者/ みきぬ (205回)-(2008/11/11(Tue) 16:00:13)
No27631 (ニッパー さん) に返信
状況がよくわからなかったのですが、↓こういうことですか? 違ってたら訂正お願いします。

1.フォーム1 を開く
2.フォーム1 のボタンを押す
  → フォーム2 が開く(ここで フォーム2オープン処理が動く)
3.フォーム2 のボタンを押す(ここで フォーム2ボタン処理が動く)
4.フォーム2 を閉じる(ここで Form2_FormClosing が動く)
5.フォーム1 のボタンを押す
  → フォーム2 が開く(ここの フォーム2オープン処理でエラー)

# Oracleは詳しくないけど、もし4の手順をしていないのなら FOR UPDATE NOWAIT の意図通りなのかしら?
引用返信 編集キー/
■27640 / inTopicNo.4)  Re[3]: nowait のエラー
□投稿者/ .SHO (11回)-(2008/11/11(Tue) 16:28:42)
直接の原因かどうかはわかりませんが
The_reader.Close()
を、ちゃんとやりましょう。
引用返信 編集キー/
■27644 / inTopicNo.5)  Re[4]: nowait のエラー
□投稿者/ ニッパー (12回)-(2008/11/11(Tue) 16:56:17)
HiJun様、みきぬ様、SHO様返信ありがとうございます。
>HiJun様
tryの中身
MessageBox.Show("現在、使用されています。フォームを閉じます。 ")
OraTran.Rollback()
OraTran.Dispose()
Me.Close()
Me.Dispose()
>みきぬ様
あってます。
キー重複、未入力、名前重複などを行っていますがなぜ一意性なのかがわかりません。
># Oracleは詳しくないけど、もし4の手順をしていないのなら FOR UPDATE NOWAIT の意図通りなのかしら?
ちゃんと機能しているか?ということでしょうか?
>.sho様
closeの意味は自分で調べますがトランザクションと同じ場所で使用すると考えてよろしいでしょうか
引用返信 編集キー/
■27647 / inTopicNo.6)  Re[5]: nowait のエラー
□投稿者/ HiJun (115回)-(2008/11/11(Tue) 17:19:18)
ODP.NETを使用しているなら、CloseやDisposeをしないと
残骸が残りっぱなしになりますので、strSQLオブジェクトや
The_readerオブジェクトにもCloseやDisposeをしてみて下さい。


引用返信 編集キー/
■27648 / inTopicNo.7)  Re[5]: nowait のエラー
□投稿者/ .SHO (12回)-(2008/11/11(Tue) 17:23:26)
No27644 (ニッパー さん) に返信
> トランザクションと同じ場所で使用すると考えてよろしいでしょうか
よろしいです。
って言うか、The_reader = strSQL.ExecuteReaderに対して毎回Closeした方がいいです。
同じselect文を繰り返すなら話は別ですが。
引用返信 編集キー/
■27654 / inTopicNo.8)  Re[1]: nowait のエラー
□投稿者/ まどか (589回)-(2008/11/11(Tue) 20:06:46)
No27631 (ニッパー さん) に返信

とにかく言えることは、一意制約エラーになることとコミットは何の関係も無いということ。
Insertした時点でそのキーがその瞬間存在するということです。


strSQLのstrはStringつまり文字列という意味です。
紛らわしく誤りですので直した方が良いです。

あと気になるところは、

・フォームとしか書いてないので同じクラスなのか違うのかがわからない。
・フォームのインスタンスの作り方がわからない。(Newなのか暗黙のインスタンスなのか)
・フォームオープンというイベントが無いのでタイミングがわからない。
・cnn,oratran,strSQLのスコープがわからない。

というところです。
引用返信 編集キー/
■27677 / inTopicNo.9)  Re[2]: nowait のエラー
□投稿者/ ニッパー (14回)-(2008/11/12(Wed) 09:34:29)
>まどか様
返信ありがとうございます。
ということは完全に作業が終了しコミットするまでSQLを投げてもいけないということでしょうか?
引用返信 編集キー/
■27680 / inTopicNo.10)  Re[3]: nowait のエラー
□投稿者/ Mr.T (293回)-(2008/11/12(Wed) 10:11:09)
2008/11/12(Wed) 10:11:56 編集(投稿者)

Mr.Tです、こんにちは

> ということは完全に作業が終了しコミットするまでSQLを投げてもいけないということでしょうか?

SQLを発行してもいいですけど、それが処理されるかどうかは別です。
引用返信 編集キー/
■27686 / inTopicNo.11)  Re[4]: nowait のエラー
□投稿者/ ニッパー (16回)-(2008/11/12(Wed) 11:52:07)
HiJun様、みきぬ様、SHO様、まどか様、Mr.T様返信ありがとうございます。
自己解決いたしました。
strSQL.commandtext1つしか使っていませんでしたが、
グリッド用、汎用、ロック用にそれぞれ使い分けたところ、再表示、及び登録、更新を行うことができました。お手数おかけして申し訳ありませんでした。
またよろしくおねがいします。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -