- PR -

OleDbDataReaderで再読込み

1
投稿者投稿内容
ラオウとトキ
常連さん
会議室デビュー日: 2002/07/18
投稿数: 34
投稿日時: 2004-01-16 16:39
みなさまお疲れ様です。
C#+Oracle+WinXPで開発を行っています。

ずばりOleDbDataReaderは複数回にわけて使用することは不可能なのでしょうか??

string SQL="select NAME_ID from NAME_MST"

OleDbCommand OldCmd = new OleDbCommand(SQL,OraCon);
OleDbDataReader OleRdr = OleCmd.ExcuteReader();

While (OleRdr.Read()) {
string strName_ID = OleRdr[0].ToString();
SQL="select NAME from NAME_MST2 where NAME_ID='" + strName_ID + "'"

OleDbCommand OldCmd = new OleDbCommand(SQL,OraCon);
OleDbDataReader OleRdr = OleCmd.ExcuteReader();
if (OldRdr.Read()) {
string strName = OleRdr[0].ToString();
}
}

とすると2度目のOleCmd.ExcuteReader(); でエラーがでてしまいます。
「・・・DataReaderwo最初に閉じる必要があります。」
とでてしまいます。
過去ログをみると、できない風な感じのようなのですが、
実際のところどうなんでしょう??
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-01-16 17:32
こんにちは

ヘルプを見たところ1コネクションにつき1つのOleDbDataReaderしか
使用できないようです。

同じ接続情報で別のOleDbConnectionを作成すれば2つのOleDbDataReaderを
同時に使用できると思います。

ためしていないのですが単一項目だけなら以下の方法で取得できるかもしれません。

Object obj = OleCmd.ExecuteScalar();
if (obj!=null) {
string strName = (string)obj;
}
KATSU
常連さん
会議室デビュー日: 2003/02/13
投稿数: 33
お住まい・勤務地: 静岡県
投稿日時: 2004-01-16 17:38
SQLServerでの話でしたが基本的には同じということで
↓ここが参考になると思います。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8213&forum=7

最後のコメントでJittaさんが
>#Oracleでやると、カーソル数の上限に達しました、になる
>必ずDisposeまたはCloseするか、ループの外で作ったものを使い回しましょう
って書いています。これ重要です。
私も痛い目に遭いました。(苦笑)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-16 17:46
引用:

ラオウとトキさんの書き込み (2004-01-16 16:39) より:

string SQL="select NAME_ID from NAME_MST"
SQL="select NAME from NAME_MST2 where NAME_ID='" + strName_ID + "'"


 これなら発行するSELECT文を、

SELECT t1.NAME FROM NAME_MST t1 NATURAL JOIN NAME_MST2 t2
(Oracle9.0以上)
SELECT t1.NAME FROM NAME_MST t1, NAME_MST2 t2 WHERE t1.NAME_ID = t2.NAME_ID

とすればよいのでは?
ラオウとトキ
常連さん
会議室デビュー日: 2002/07/18
投稿数: 34
投稿日時: 2004-01-24 23:27
みなさまレクチャーいろいろありがとうございます。
ご返事おくれました。

わかり易く説明する為に非常に簡単なSQLの事例を出した為に、
誤解されるレスもあったようですね。
申し訳ありません。説明不足でした。
結果としては、
やはり、1つしか駄目なようですね。・・。
自分はArrayListを使って、
とりあえずですが擬似的なSQLの結果の格納用クラスを使って対処するようにしました。
(VBで言うRecordset、Javaで言うResultSetのようなものを作成しました。)
複雑なクエリーになってくると使えそうもないですね。
最初の技術はいつもいろいろと頭を悩ませます。
困ったものです。
あとはOracleの(名前を忘れてしまいましたが0040に変わる)方を、
使ってみるしかなさそうですね。

皆様ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-25 15:39
引用:

ラオウとトキさんの書き込み (2004-01-24 23:27) より:

わかり易く説明する為に非常に簡単なSQLの事例を出した為に、
誤解されるレスもあったようですね。

複雑なクエリーになってくると使えそうもないですね。
最初の技術はいつもいろいろと頭を悩ませます。
困ったものです。

あとはOracleの(名前を忘れてしまいましたが0040に変わる)方を、
使ってみるしかなさそうですね。


 複雑であろうが、基本的に同じことをするなら、最初に結合させる方がよいです。Oracle9iならば外部結合にOUTER JOIN句が使えるので、表の結合と抽出条件を分けて考えることができます。データベースから取り出し、その結果を基にまたデータベースに問い合わせにいくより、よっぽど効率的でわかりやすいプログラムができます。さらにビューを使うなどで対応することも可能です。複雑なクエリはそのように、簡単にできる方法を探して対応します。
#基本的に、データベースのことはデータベース中でけりをつける

 Oracle Data Provider for .NETも同じ制限があります。1つのコネクションに対してDataReaderは1つです。
#ベースとなる技術は同じなんですから
ラオウとトキ
常連さん
会議室デビュー日: 2002/07/18
投稿数: 34
投稿日時: 2004-01-25 18:27

Jittaさんありがとうございます。
 
>Oracle Data Provider for .NETも同じ制限があります。1つのコネクションに対して>DataReaderは1つです。
>#ベースとなる技術は同じなんですから

OracleDaraProviderもできないのですか?
OO40の時と同じイメージがあったのですが・・。
OO40より使いにくくなってしまったのでしょうか??
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-26 08:07
引用:

ラオウとトキさんの書き込み (2004-01-25 18:27) より:

>Oracle Data Provider for .NETも同じ制限があります。1つのコネクションに対して>DataReaderは1つです。
>#ベースとなる技術は同じなんですから

OracleDaraProviderもできないのですか?


 失礼。マニュアルを確認しましたが、明確な言及はありません。
 MSの、.NET Data Provider for OracleのOracleDataReaderを確認すると、
引用:
OracleDataReader はいつでも複数開くことができます。


ということなので、OracleClientDatareaderも、おそらく複数開くことができると思われます。
1

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