- PR -

C#でのORACLE接続&データ抽出

投稿者投稿内容
ash
会議室デビュー日: 2003/08/08
投稿数: 6
お住まい・勤務地: 神奈川
投稿日時: 2003-08-08 01:23
はじめまして。
C#初心者ですので、何卒よろしくお願い致します。

C#で.NET Framework Data Provider for Oracleを使用して
ORACLEに接続してデータ抽出しているのですが、
1レコード目は正常に抽出できるのですが、
2レコード目から、いくつかの列のデータが中途半端な状態で
抽出されます。
SQL*Plus等で、そのSQL文を実行すると正常に抽出できてます。

どなたか、このような現象の解決方法お解りの方いらっしゃいますか?


[参考]
.NET Framework:1.0
ORACLE:8.1.7
なな
ぬし
会議室デビュー日: 2003/06/22
投稿数: 659
お住まい・勤務地: 愛知県
投稿日時: 2003-08-08 08:05
テストコードは掲載できませんか?


[ メッセージ編集済み 編集者: なな 編集日時 2003-08-08 08:05 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-08 08:20
こんにちは。
引用:

ashさんの書き込み (2003-08-08 01:23) より:

C#で.NET Framework Data Provider for Oracleを使用して
ORACLEに接続してデータ抽出しているのですが、
1レコード目は正常に抽出できるのですが、
2レコード目から、いくつかの列のデータが中途半端な状態で
抽出されます。


 「中途半端な状態」とは、どのようなものでしょう?
 DataReaderを使っていますか?それともDataAdapterを使いましたか?
 Oracleデータベースの文字コードセットは何にしましたか?
ash
会議室デビュー日: 2003/08/08
投稿数: 6
お住まい・勤務地: 神奈川
投稿日時: 2003-08-08 09:39
Jittaさん、ななさん
はじめまして。

実際やりたい事は、下記のテストコードのように
パッケージを呼んでカーソルで、データ抽出を行いたいのですが、
(パッケージでは、単純にカーソルを作っているだけです。)
また、パッケージを使用せずに、じかにSQL文をソースコード上に書いて
実行しても同じ結果でした。


[テストコード]
----------------------------------------------------------------------------
String sConnectionString = "User ID=userid;password=password;
               Data Source=oracle;Persist Security Info=No";

OracleConnection myConnection = new OracleConnection(sConnectionString);
OracleCommand myCommand =
    new OracleCommand("TEST.TEST1",myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
OracleParameter myParameter1 = new OracleParameter("RTN_CD", OracleType.Int32);
myCommand.Parameters.Add(myParameter1);
OracleParameter myParameter2 =
    new OracleParameter("CURSOL", OracleType.Cursor);
myParameter2.Direction = ParameterDirection.Output;
myCommand.Parameters.Add(myParameter2);

try {
myConnection.Open();
OracleDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read()){

Console.WriteLine("AAA[" + myReader["AAA"] + "]BBB[" +
myReader["BBB"] + "]CCC[" + myReader["CCC"] + "]DDD[" +
myReader["DDD"] + "]");
}
myReader.Close();
myConnection.Close();
} catch( OracleException ex ) {
Console.WriteLine(ex.ToString());
} finally {
myConnection.Close();
}
----------------------------------------------------------------------------

[抽出結果]
AAA[21085]BBB[0307090545]CCC[5149]DDD[100237]
AAA[21087]BBB[0307090547]CCC[51??]DDD[100231]
AAA[21088]BBB[0307090548]CCC[51 ]DDD[100 ]
AAA[21089]BBB[0307090549]CCC[51 ]DDD[100252]
AAA[21090]BBB[0307090550]CCC[51 ]DDD[100 ]

テーブルレコード上は"CCC"は4桁、"DDD"は6桁すべて数字で埋まっていますが
なぜか、うまく抽出できていません。

ほかに必要事項があれば、また書き加えますので言ってください。
よろしくお願いいたします。


[ メッセージ編集済み 編集者: ash 編集日時 2003-08-08 09:41 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-08 10:11
 OleDbだけかもしれませんが、接続文字列におまじないがないような?


"…;PLSQLRSet=True"←OleDbでは、カーソルを開くために必要

 それから、数字を受けるのは、Int32ではなくDecimalを使う方がいいみたいです。こちらの方が有効桁数が広いので。ただし、Oracleで表現可能なすべての文字が受けられるわけではありません(Oracleの文書に記載アリ)。
ash
会議室デビュー日: 2003/08/08
投稿数: 6
お住まい・勤務地: 神奈川
投稿日時: 2003-08-08 10:44
Jittaさん、早速のご返答ありがとうございます。

>> "…;PLSQLRSet=True"←OleDbでは、カーソルを開くために必要
.NET Framework Data Provider for Oracleでは、下記のエラー出てしまいました。
『ハンドルされていない例外 : System.ArgumentException:
         サポートされていないキーワードです : 'plsqlrset'。』

OleDbでもPL/SQLが使用できるんですか?
また、何かインストールする必要がありますか?
今までの方法で、どうしてもだめなようであれば、
OleDbを使用して作成しようかと思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-08 11:58
引用:

ashさんの書き込み (2003-08-08 09:39) より:

[テストコード]
----------------------------------------------------------------------------
OracleParameter myParameter2 =
    new OracleParameter("CURSOL", OracleType.Cursor);

OracleDataReader myReader = myCommand.ExecuteReader();


この組み合わせですが、MSDNの『OracleType列挙体』に、
引用:

Oracle の REF CURSOR 。 OracleDataReader オブジェクトは使用できません。


とあるのは、お読みになりました?

『OracleDataReader クラス』の方で、REF CURSORを使ったサンプルがありますが、肝心の所は載っていませんねぇ。『使用できません』と言いながら、使用しているし。さすがマイクロソフトですねぇ。
 とりあえず、デバッガで止めて、戻ってきている値の型を調べてみてください。もしかしたら、変な型になっているかもしれません。


 OleDbでは、パラメータを指定せずに1つだけ受け取ることができるようです。すみません、ここ1ヶ月に調べたことなのに、忘れています。う〜ん、ここで以前書いたような??

 ODP.NET(Oracleから提供されているもの)では、OracleRefCursorというクラスがあって、こいつで受けるようになっているようです。DataReaderをグリグリ回すのではなく、このクラスの中で回るようです。
ash
会議室デビュー日: 2003/08/08
投稿数: 6
お住まい・勤務地: 神奈川
投稿日時: 2003-08-08 12:28
Jittaさんありがとうございます。

引用:

Jittaさんの書き込み (2003-08-08 11:58) より:

『OracleDataReader クラス』の方で、REF CURSORを使ったサンプルがありますが、肝心の所は載っていませんねぇ。『使用できません』と言いながら、使用しているし。さすがマイクロソフトですねぇ。


そうなんですよ。
『OracleDataReader クラス』を参考にして作成したのに・・・。
『OracleType列挙体』では、使用できませんなんて・・・。
悲しいです。

引用:

 OleDbでは、パラメータを指定せずに1つだけ受け取ることができるようです。すみません、ここ1ヶ月に調べたことなのに、忘れています。う〜ん、ここで以前書いたような??


『OleDbDataReaderでストアドプロシージャで実行した検索結果を読み込みたい。』スレッドで、書き込んでいる内容ですね、きっと・・・?

引用:

とりあえず、デバッガで止めて、戻ってきている値の型を調べてみてください。もしかしたら、変な型になっているかもしれません。


DOS上で実行しているので、戻ってきている値の型はすみませんが知らべられません。


他の方法で、試してみます。
ありがとうございました。

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