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

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

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

Re[2]: oracleで位置決めした次の行を読む方法教えてください


(過去ログ 74 を表示中)

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

■43469 / inTopicNo.1)  oracleで位置決めした次の行を読む方法教えてください
  
□投稿者/ 裕猫 (46回)-(2009/11/11(Wed) 08:57:13)

分類:[C#] 

Oracle10g、WindowsXP、VisualStudio2008C#にてODPを使いoracleを操作するプログラムで汎用アクセスルーチンを作成しています。
データ検索、作成、消去はできたのですが検索したデータの次を読むルーチンができません。
        public static int DBF(string DB名, string Key名, int Ow)
        {
            int x = 0;
            using (OracleConnection con = new OracleConnection())
            {
                con.ConnectionString = UID;
                try
                {
                    con.Open();
                }
                catch
                {
                    MessageBox.Show("データベースの接続に失敗しました。");
                    return x;
                }
                OracleCommand cmd = con.CreateCommand();
                cmd.CommandText = "select * from " + DB名 + " where " + Key名;
                OracleDataReader dr = cmd.ExecuteReader();
                try
                {
                    dr.Read();
                    for (int i = 0; i < Ow; i++)
                    {
                        Tenso.OJ[i] = dr[i];
                    }
                    x = 1;
                }
                catch
                {
                    MessageBox.Show("データが見つかりませんでした。");
                }
            }
            return x;
        }

        public static int DBN(string DB名, string Key名, int Ow)
        {
            int x = 0;
            using (OracleConnection con = new OracleConnection())
            {
                con.ConnectionString = UID;
                try
                {
                    con.Open();
                }
                catch
                {
                    MessageBox.Show("データベースの接続に失敗しました。");
                    return x;
                }
                OracleCommand cmd = con.CreateCommand();
                cmd.CommandText = "select * from " + DB名 + " where " + Key名;
                OracleDataReader dr = cmd.ExecuteReader();
                dr.Read();
                try
                {
                    dr.Read();
                    for (int i = 0; i < Ow; i++)
                    {
                        Tenso.OJ[i] = dr[i];
                    }
                    x = 1;
                }
                catch
                {
                    MessageBox.Show("データが見つかりませんでした。");
                }
            }
            return x;
        }
というように作りましたが、DBF実行後処理をしてDBNを実行するのですがDBFで見つけたデータの次のデータが読めません。DBNのSQL文だと思うのですがどのようにしたらDBFで見つけたデータの次のデータを読んでくれるようになるでしょう?お力添えお願いします。

引用返信 編集キー/
■43474 / inTopicNo.2)  Re[1]: oracleで位置決めした次の行を読む方法教えてください
□投稿者/ すがり (88回)-(2009/11/11(Wed) 09:43:55)
同じメソッドが2個並んでいるように見えるのですが、いったい何を
やりたいのか見当が付かないです・・・

using Oracle.DataAccess.Client;
...

using (OracleConnection con = new OracleConnection())
{
  con.ConnectionString = "User Id=scott; Password=tiger; Data Source=oracle";
  con.Open();

  try
  {
    // Commandオブジェクト生成
    using (OracleCommand cmd = con.CreateCommand())
    {
      cmd.CommandText = "select column1, column2 from test where column1 = '101'";

      // クエリの実行
      using (OracleDataReader reader = cmd.ExecuteReader())
      {
        while (reader.Read())
        {
          Console.WriteLine(reader["column1"]);
          Console.WriteLine(reader["column2"]);
        }
      }
    }
  }
  finally
  {
    if (con != null)
    {
      con.Close();
    }
  }
}

適当にコピペしてきたソースですけど、while (reader.Read())でデータがなくなるまで読む
といったことをしたい、という意味でしょうか?

引用返信 編集キー/
■43476 / inTopicNo.3)  Re[2]: oracleで位置決めした次の行を読む方法教えてください
□投稿者/ 裕猫 (47回)-(2009/11/11(Wed) 10:16:24)
No43474 (すがり さん) に返信
> 同じメソッドが2個並んでいるように見えるのですが、いったい何を
> やりたいのか見当が付かないです・・・
>
このプログラムはクラスライブラリです。メインのプログラムからDBFでデータをとり処理をして次のデータを読んで同じ処理をするループを作ります。
メインルーチン
DBF()
while
{
if(条件)
{
break;
}
処理
DBN ←次のデータを読む
}
あちらこちらのプログラムで同じような動作をさせるためOracleの接続部分をクラスライブラリにして共通化をします。DBFを実行後Oracleとの接続は切れますのでDBNで再接続して位置決めが必要になると考えて先のようなプログラムになりました。

> 適当にコピペしてきたソースですけど、while (reader.Read())でデータがなくなるまで読む
> といったことをしたい、という意味でしょうか?
1動作1行を読み込むだけの動作にしたいです。
おっしゃるようにするとメインで一々SQL文を発行します。100を超えるプログラムに一々書き込むのは無駄なのでそこの処理をクラスライブラリにして共通化を図りたいわけです。  うまく説明できたかな?
引用返信 編集キー/
■43478 / inTopicNo.4)  Re[1]: oracleで位置決めした次の行を読む方法教えてください
□投稿者/ はつね (1103回)-(2009/11/11(Wed) 10:46:53)
はつね さんの Web サイト
No43469 (裕猫 さん) に返信
> データ検索、作成、消去はできたのですが検索したデータの次を読むルーチンができません。

SQL文での実装がむずかしいと思います。
ストアドと組み合わせてRefCursorで実装したりするとできるかもしれません。


> 100を超えるプログラムに一々書き込むのは無駄なので

それぞれのプログラムでデータアクセスよりも大きな括りで共通部分は共通化しているの
であれば、自ずとデータアクセスについても同じSQL文があっちこっちに現れる頻度も低く
なると思われますし、それならばODP.NETの利用部分を共通化していなくても一概には無駄
とも言い切れないかも。
ODP.NET周りだけ共通化するのではなく、データ的に同じものを扱うルーチンを共通化する
という方法論もあります。
なぜならば、ADO.NET(ODP.NET)もデータアクセスを共通化するもので、それと同レベルの
機能を共通ルーチンとすることで、今回のように面倒な処理(=速度的に不利の可能性も)
を記述しないといけないことに陥る可能性があるからです。

引用返信 編集キー/
■43479 / inTopicNo.5)  Re[2]: oracleで位置決めした次の行を読む方法教えてください
□投稿者/ 裕猫 (48回)-(2009/11/11(Wed) 11:16:28)
No43478 (はつね さん) に返信
> SQL文での実装がむずかしいと思います。
> ストアドと組み合わせてRefCursorで実装したりするとできるかもしれません。
>
返信ありがとうございます。そうですか今の自分の実力では無理そうです。

> それぞれのプログラムでデータアクセスよりも大きな括りで共通部分は共通化しているの
> であれば、自ずとデータアクセスについても同じSQL文があっちこっちに現れる頻度も低く
> なると思われますし、それならばODP.NETの利用部分を共通化していなくても一概には無駄
> とも言い切れないかも。
> ODP.NET周りだけ共通化するのではなく、データ的に同じものを扱うルーチンを共通化する
> という方法論もあります。
> なぜならば、ADO.NET(ODP.NET)もデータアクセスを共通化するもので、それと同レベルの
> 機能を共通ルーチンとすることで、今回のように面倒な処理(=速度的に不利の可能性も)
> を記述しないといけないことに陥る可能性があるからです。
>
わかりました。DBNは作らずに他の方法を考えます。DBNを考えなければ すがりさんの方法で簡単にできますのでそちらの方向に変えることにします。ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -