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

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

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

Re[8]: Oracle10gのループ処理で問題発生


(過去ログ 110 を表示中)

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

■65366 / inTopicNo.1)  Oracle10gのループ処理で問題発生
  
□投稿者/ 裕猫 (36回)-(2013/02/20(Wed) 16:20:10)

分類:[データベース全般] 

2013/02/20(Wed) 16:24:49 編集(投稿者)
OS: Windows7
言語: VisualStudio2010 C#
Oracle10gで開発しています。

        private void button6_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows.Clear();
            try
            {
                using (OracleConnection con = new OracleConnection())
                {
                    con.ConnectionString = MKST.UID;
                    con.Open();

                    using (OracleCommand cmd = con.CreateCommand())
                    {
                        cmd.CommandText = "select * from AM80 ORDER BY 手形区分 ASC,期日 ASC,番号 ASC";
                        using (OracleDataReader dr = cmd.ExecuteReader())
                        {
                            while (dr.Read())
                            {
                                DGVOJ[0] = CVR.CVS(dr[0]);
                                DGVOJ[1] = CVR.CVS(dr[1]);
                                DGVOJ[2] = CVR.CVS(dr[3]);
                                dataGridView1.Rows.Add(DGVOJ);
                            }
                        }
                    }
                }
            }
            catch (OracleException OEX) { MessageBox.Show(OEX.Message); }
            catch (Exception EX) { MessageBox.Show(EX.Message); }
            MessageBox.Show("検索完了");
        }
のようにしてdataGridView1に全テーブルデータを表示させていたのですが件数が多くて時間がかかり一定時間操作がないというエラーで止まってしまうので
        public static string DBF(string DBName, string KYN, object[] KY_OJ, string UD, Object[] XJ)
        {
            try
            {
                using (OracleConnection con = new OracleConnection())
                {
                    con.ConnectionString = MKST.UID;
                    con.Open();

                    Object[] OJ = new Object[XJ.Length];
                    using (OracleCommand cmd = con.CreateCommand())
                    {
                        if (KY_OJ[0] == null) { cmd.CommandText = "select * from " + DBName + " ORDER BY " + DB_String.Order_Make(DBName, KYN, UD); }
                        else
                        {
                            cmd.CommandText = "select * from " + DBName + " where " + DB_String.Key_Make(DBName, KYN, KY_OJ) + " ORDER BY "
                                + DB_String.Order_Make(DBName, KYN, UD);
                        }
                        using (OracleDataReader dr = cmd.ExecuteReader())
                        {
                            dr.Read();
                            for (int CT1 = 0; CT1 < XJ.Length; CT1++)
                            {
                                OJ[CT1] = dr[CT1];
                            }
                            Array.Copy(OJ, XJ, XJ.Length);
                        }
                    }
                    con.Clone();
                    con.Dispose();
                }
                return null;
            }
            catch (OracleException OEX)
            { return OEX.Message; }
            catch (Exception EX)
            { return EX.Message; }
        }

        public static string DBN(string DBName, string KYN, string UD, object[] HOJ)
        {
            int K_Ban = 0;
            string RD = null;
            for (int CT1 = 0; CT1 < 10; CT1++)
            {
                if (MKST.KYS[CT1] == KYN) { K_Ban = CT1 + 10; break; }
            }
            string[] K_Koumoku = MKST.KYS[K_Ban].Split(',');
            int Sindo = K_Koumoku.Length;
            for (int CT2 = Sindo; CT2 > 0; CT2--)
            {
                RD = NextSerch(DBName, KYN, HOJ, UD, CT2);
                if (RD == null) { break; }
            }
            return RD;
        }

        public static string NextSerch(string DBName, string KYN, object[] HOJ, string UD,int Sindo)
        {
            try
            {
                using (OracleConnection con = new OracleConnection())
                {
                    con.ConnectionString = MKST.UID;
                    con.Open();

                    Object[] OJ = new Object[HOJ.Length];
                    using (OracleCommand cmd = con.CreateCommand())
                    {
                        cmd.CommandText = "select * from " + DBName + " where " + DB_String.Key_Make3(DBName, KYN, UD, HOJ, Sindo) + " ORDER BY "
                            + DB_String.Order_Make(DBName, KYN, UD);
                        //MessageBox.Show(SSS);
                        using (OracleDataReader dr = cmd.ExecuteReader())
                        {
                            dr.Read();
                            MessageBox.Show(Henkan.CVL(dr[3]).ToString());
                            for (int CT1 = 0; CT1 < HOJ.Length; CT1++)
                            {
                                OJ[CT1] = dr[CT1];
                            }
                            Array.Copy(OJ, HOJ, HOJ.Length);
                        }
                    }
                    con.Clone();
                    con.Dispose();
                }
                return null;
            }
            catch (OracleException OEX) { return OEX.Message; }
            catch (Exception EX) { return EX.Message; }
        }
の3つを作り
        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows.Clear();
            KOJ = new object[1];
            RD = DB_CTR.DBF("AM80", "AM81", KOJ, "u", MKST.AM80OLD);
            FG1 = 1;
            while (true)
            {
                if (RD == null) { OJSet(MKST.AM80OLD); } else { break; }
                if (FG1 > 50) { break; }
                RD = DB_CTR.DBN("AM80", "AM81", "u", MKST.AM80OLD);
                FG1++;
            }
        }
というようにしてデータを読んだのですが46個データを読んだ後、public static string NextSerch(string DBName, string KYN, object[] HOJ, string UD,int Sindo)
のdr.Read();の値が次のデータに変わらなくなってしまい、47個目以後のデータを読まなくなってしまいました。
46個目まではちゃんと次のデータを読んでいるのに47個目から読まなくなるのか原因が解らなく困っています。
このような症状を解決したことがある方いらっしゃいましたら回避方法を教えていただきたくよろしくお願いいたします。
 追記接続には11gのODP.NETを使っています。 サーバーはwindows2000server +Oracle10g クライアントはwin7です。

引用返信 編集キー/
■65370 / inTopicNo.2)  Re[1]: Oracle10gのループ処理で問題発生
□投稿者/ abe (1回)-(2013/02/20(Wed) 22:07:05)
DataReaderではなくてDataTableに落としたものをDataGridViewにバインドする方法ではだめですか?
引用返信 編集キー/
■65374 / inTopicNo.3)  Re[2]: Oracle10gのループ処理で問題発生
□投稿者/ 裕猫 (37回)-(2013/02/21(Thu) 09:54:28)
No65370 (abe さん) に返信
> DataReaderではなくてDataTableに落としたものをDataGridViewにバインドする方法ではだめですか?
返信ありがとうございます。
 今回のプログラムは dataGridView1で表示するところでいろいろな処理をするためのテストパターンです。
dataGridView1を使用しているのは新たに作成した
public static string DBN(string DBName, string KYN, string UD, object[] HOJ) {  }  と
DB_String.Key_Make3(DBName, KYN, UD, HOJ, Sindo){}  が設計通りの動作をするかを検証するためで必ず
dataGridView1を必ず使用するわけではありません。なのでdataGridView1にバインドする方法は使えない場合があるので使えません。
 動作結果を書きますと、実行したがどこかで無限ループに入ってしまって止まらなくなっていました。
まず疑ったのは DB_String.Key_Make3(DBName, KYN, UD, HOJ, Sindo){} 次のキーをちゃんと生成していないのでは?
ということで DB_String.Key_Make3(DBName, KYN, UD, HOJ, Sindo){}の作成内容を見ていきました。50個のサンプルを
処理していくと、46個目のキーから後ろのキーのデータが変わらなくなりました。
途中で変わらなくなるのでDB_String.Key_Make3(DBName, KYN, UD, HOJ, Sindo){}に渡されるデータに問題があるのでは?
ということでデータベースの内容を入れるHOJを見たところ、46個目以降同じデータを渡していました。
HOJにはOracleDataReader dr で読み込んだデータをArray.Copy(OJ, XJ, XJ.Length);でコピーしているのでそのあたりを
調べているとdr.Read()で読み込んだOracleのデータが変わらなくなっていました。
cmd.CommandText = "select * from AM80 where 日付 = '130201' and 番号 > '2010' ORDER BY 日付 ASC,番号 ASC";
という文を作成しています。ので日付 = '130201' 番号 = '2011'を読んでくるはずなのに日付 = '130201' 番号 = '2010'
のデータが返ってきます。
日付 = '130201' 番号 = '2011'のデータは存在しますし、
private void button6_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Clear();
try
{
using (OracleConnection con = new OracleConnection())
{
con.ConnectionString = MKST.UID;
con.Open();

using (OracleCommand cmd = con.CreateCommand())
{
cmd.CommandText = "select * from AM80 ORDER BY 日付 ASC,番号 ASC";
using (OracleDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
DGVOJ[0] = CVR.CVS(dr[0]);
DGVOJ[1] = CVR.CVS(dr[1]);
DGVOJ[2] = CVR.CVS(dr[3]);
dataGridView1.Rows.Add(DGVOJ);
}
}
}
}
}
catch (OracleException OEX) { MessageBox.Show(OEX.Message); }
catch (Exception EX) { MessageBox.Show(EX.Message); }
MessageBox.Show("検索完了");
}
のルーチンで日付 = '130201' 番号 = '2011'のデータはちゃんと日付 = '130201' 番号 = '2010'の次に表示されています。
なにが原因なのか?不明です。
引用返信 編集キー/
■65377 / inTopicNo.4)  Re[3]: Oracle10gのループ処理で問題発生
□投稿者/ shu (199回)-(2013/02/21(Thu) 11:23:27)
No65374 (裕猫 さん) に返信

> ・・・ DB_String.Key_Make3(DBName, KYN, UD, HOJ, Sindo) ・・・
この辺があやしいと思います。ぱっとみた感じこれらの引数の内容はほとんど変化が
ないような気がします。Key_Make3でPublicなものを参照されているのでしょうか?

抽出データをなんらかのグループに区切って回数をわけ取得するように
されているのでしょうか?条件がどのように変わっていくのか検証されたほうがよいのでは
ないでしょうか?Key_Make3のロジックがさっぱり分からないので的をえた回答は無理です。
引用返信 編集キー/
■65383 / inTopicNo.5)  Re[4]: Oracle10gのループ処理で問題発生
□投稿者/ 裕猫 (39回)-(2013/02/21(Thu) 12:56:12)
2013/02/21(Thu) 13:12:44 編集(投稿者)

No65377 (shu さん) に返信
>>・・・ DB_String.Key_Make3(DBName, KYN, UD, HOJ, Sindo) ・・・
> この辺があやしいと思います。ぱっとみた感じこれらの引数の内容はほとんど変化が
> ないような気がします。Key_Make3でPublicなものを参照されているのでしょうか?
>
> 抽出データをなんらかのグループに区切って回数をわけ取得するように
> されているのでしょうか?条件がどのように変わっていくのか検証されたほうがよいのでは
> ないでしょうか?Key_Make3のロジックがさっぱり分からないので的をえた回答は無理です。
Key_Make3はクラスライブラリにあります。別のクラスライブラリにキーの項目などを羅列してそれをpublicにして読み込みHOJで受け取ったデータベースの内容を使ってSindoで指定された項目を>にして次のデータを指定するwhere文をstringとして返す仕組みになっています。ごちゃごちゃしているので全部を載せるのは無理かと思いますが、select文の前にメッセージボックスで返してくるwhere文の内容を確認すると正しいものを返してきます。45個目まではそれでちゃんと動くのでなんだろうと.....oracleの制御用のコードが入ってしまうのかもしれないですね。
引用返信 編集キー/
■65384 / inTopicNo.6)  Re[5]: Oracle10gのループ処理で問題発生
□投稿者/ ado (2回)-(2013/02/21(Thu) 14:50:49)
2013/02/21(Thu) 14:53:53 編集(投稿者)

No65374のbutton6_Clickのテストコードで、SQLを

"select * from AM80 where 日付 = '130201' and 番号 > '2010' ORDER BY 日付 ASC,番号 ASC"

にして実行するとどうなりますか?
日付 = '130201' 番号 = '2011'のデータは取れますか?
それとも日付 = '130201' 番号 = '2010'のデータですか?

もし番号 = '2011'のデータが取れないのなら、データがおかしいかも知れません。

また、「実行したがどこかで無限ループに入ってしまった」とありますが、その箇所は特定できましたか?
提示コードでは無限ループになる可能性のありそうな箇所が見当たらなかったので。
引用返信 編集キー/
■65393 / inTopicNo.7)  Re[6]: Oracle10gのループ処理で問題発生
□投稿者/ 裕猫 (40回)-(2013/02/21(Thu) 16:44:25)
No65384 (ado さん) に返信
> 2013/02/21(Thu) 14:53:53 編集(投稿者)
>
> No65374のbutton6_Clickのテストコードで、SQLを
>
> "select * from AM80 where 日付 = '130201' and 番号 > '2010' ORDER BY 日付 ASC,番号 ASC"
>
> にして実行するとどうなりますか?
> 日付 = '130201' 番号 = '2011'のデータは取れますか?
> それとも日付 = '130201' 番号 = '2010'のデータですか?
>
> もし番号 = '2011'のデータが取れないのなら、データがおかしいかも知れません。
>
> また、「実行したがどこかで無限ループに入ってしまった」とありますが、その箇所は特定できましたか?
> 提示コードでは無限ループになる可能性のありそうな箇所が見当たらなかったので。
アドバイスありがとうございます。早速試したところオブジェクトの状態に問題がありますとのエラーが出ました。DBFにも同様のエラーが出ましたのでどうも検索プログラムが正常に
動作しないようだとわかりました。再度クラスライブラリの検索プログラムを作り直して見ます。
引用返信 編集キー/
■65404 / inTopicNo.8)  Re[7]: Oracle10gのループ処理で問題発生
□投稿者/ Jitta (33回)-(2013/02/21(Thu) 22:26:08)
Jitta さんの Web サイト
No65393 (裕猫 さん) に返信

 コードを読むのが大変なのですが...
あなたがコンピュータにさせたいと“思っていること”と、実際にコンピュータに“やらせていること”は、一致しているのでしょうか。
この二つが一致していなければ、決してコンピュータはあなたが思っているとおりには動きません。
少なくともこの様な場にコードを出すのなら、コードの要所要所で何をしようとしているか、解説を入れて下さい。
何をしたいのかもわからないコードをゼロから読んでいくのは、本当に大変です。

 一般的には、上記の“思っていること”と“やらせていること”に差があることを「バグがある」といいます。
今回の投稿では、“思っていること”が説明されていないため、第三者には差を見つけられません。
たいていの場合、“やらせていること”を隣の席の人や、上司に説明することで、“思っていること”との差を見つけることが出来ます。


> 46個目まではちゃんと次のデータを読んでいるのに47個目から読まなくなるのか原因が解らなく困っています。
 この表現も、わかりにくいです。
データが47個以上返ってくるはずなのに、46個分しか読めないのでしょうか。
それとも、46個目までは違うデータが返ってくるが、47個目以降は46個目のデータと同じものが返ってくるのでしょうか。この時、データの全体の個数は、期待しているデータの個数と一致しているのでしょうか。


> 件数が多くて時間がかかり一定時間操作がないというエラーで止まってしまうので
 これも、わからないですね。
「一定時間操作がないというエラー」を、要約せずに正しく記載して下さい。
そして、変更後のコードでも、同じエラーが出ると思います。


> NextSerch()のdr.Read();の値が次のデータに変わらなくなってしまい
 NextSerch(「サーチ」なら、Search ですよ?)では、呼ばれる度に接続して、コマンドを作って、読み取りを行っています。「次のデータ」は、何で指定するのでしょうか。
そのデータは、あなたが思っているとおりの「次のデータ」を指しているでしょうか。

--------------------------------------------------
と、朝8時に見たときのもの。

> (2013/02/21(Thu) 09:54:28)
> 50個のサンプルを処理していくと、46個目のキーから後ろのキーのデータが変わらなくなりました。
ということですが、「50」というのは、button1_Click() の FG1 でしょうか。
「if (FG1 > 50) { break; }」と、それらしいことが書いてありますけど。
もしそうなら、FG1 が変化しても、DB_CTR.DBN() には渡っていないですよね?

 本当に、「件数が多くて時間がかかり一定時間操作がないというエラー」への対応として、今のコードが正しいのですか?それが「正しい」と言える根拠は何ですか?
 最初のコードでは AM80 テーブルの内容を OracleDataReader で列挙していますが、1行ずつ取り出していますよね。ここで、Oracle から「一定時間操作がないというエラー」になるとは思えません。
すると、button6_Click() を呼び出して、この中で表の読み取りで時間がかかる事から、Windows がエラーを出していると考えられます。(ないと思うけど、フォームを動かそうとしたら応答がない、というメッセージが出てくると思う)
そうであるなら、新しいコードも、50件取り出しに制限したことでエラーを回避したというのなら、取り出す行数が増えれば、エラーになるはずです。

 取得するデータの件数を限りたいなら、これが参考になると思います。
http://www.shift-the-oracle.com/sql/select-top.html

引用返信 編集キー/
■65410 / inTopicNo.9)  Re[8]: Oracle10gのループ処理で問題発生
□投稿者/ 裕猫 (41回)-(2013/02/22(Fri) 09:54:49)
No65404 (Jitta さん) に返信
>  コードを読むのが大変なのですが...
> あなたがコンピュータにさせたいと“思っていること”と、実際にコンピュータに“やらせていること”は、一致しているのでしょうか。
> この二つが一致していなければ、決してコンピュータはあなたが思っているとおりには動きません。
> 少なくともこの様な場にコードを出すのなら、コードの要所要所で何をしようとしているか、解説を入れて下さい。
> 何をしたいのかもわからないコードをゼロから読んでいくのは、本当に大変です。
すいません。独自に作ったクラスライブラリなどを呼ぶのでコード出してもわかりませんですね。以後気をつけます。

>>46個目まではちゃんと次のデータを読んでいるのに47個目から読まなくなるのか原因が解らなく困っています。
>  この表現も、わかりにくいです。
> データが47個以上返ってくるはずなのに、46個分しか読めないのでしょうか。
> それとも、46個目までは違うデータが返ってくるが、47個目以降は46個目のデータと同じものが返ってくるのでしょうか。この時、データの全体の個数は、期待しているデータの個数と一致しているのでしょうか。

46個目までは違うデータが返ってくるが、47個目以降は46個目のデータと同じものが返ってきます。データは50個あります。
>>件数が多くて時間がかかり一定時間操作がないというエラーで止まってしまうので
>  これも、わからないですね。
> 「一定時間操作がないというエラー」を、要約せずに正しく記載して下さい。
> そして、変更後のコードでも、同じエラーが出ると思います。
すいません。出たときのエラーメッセージを記録してないので内容のみ書きました。現在そのエラーを出すプログラムがないのでまた見つけたときには記録しておきます。

>>NextSerch()のdr.Read();の値が次のデータに変わらなくなってしまい
>  NextSerch(「サーチ」なら、Search ですよ?)では、呼ばれる度に接続して、コマンドを作って、読み取りを行っています。「次のデータ」は、何で指定するのでしょうか。
> そのデータは、あなたが思っているとおりの「次のデータ」を指しているでしょうか。
スペルミスってました。「次のデータ」はDB_String.Key_Make3(DBName, KYN, UD, HOJ, Sindoでできたwhereのキーが示すデータでキーの文章はメッセージボックスで見る限り正しい文でした。

>>(2013/02/21(Thu) 09:54:28)
>>50個のサンプルを処理していくと、46個目のキーから後ろのキーのデータが変わらなくなりました。
> ということですが、「50」というのは、button1_Click() の FG1 でしょうか。
> 「if (FG1 > 50) { break; }」と、それらしいことが書いてありますけど。
> もしそうなら、FG1 が変化しても、DB_CTR.DBN() には渡っていないですよね?
50はAM80のデータ数です。FG1は エラーを出さずに46個目のデータを繰り返し処理しているので強制終了をかけるために入れました。

>  本当に、「件数が多くて時間がかかり一定時間操作がないというエラー」への対応として、今のコードが正しいのですか?それが「正しい」と言える根拠は何ですか?
これは正しいかどうかわかりません。現行F-BASICで運用しているシステムをXP以降のOSに対応させるためC#に移植しています。F-BASICのシステムと同じ検索方法をとるために同様の
アクセス処理を作っているところです。C#が独自に出しているエラーかもしれませんし、ORACLEかもしれません。しかしF-BASICのシステムでは「件数が多くて時間がかかり一定時間
操作がないというエラー」は出ていませんのでOracleのエラーならこれで回避できるはずだと考えて作っています。C#のエラーだとわかればまたそのときに考えようと思います。

とりあえず再度アクセス用のクラスライブラリを1から作り直してみることにしました。その結果また問題が出たらお力借りようと思います。とりあえず解決済みといたします。
いろいろありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -