- - PR -
C#でのORACLE接続&データ抽出
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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-08-08 08:05
テストコードは掲載できませんか?
[ メッセージ編集済み 編集者: なな 編集日時 2003-08-08 08:05 ] | ||||||||||||
|
投稿日時: 2003-08-08 08:20
こんにちは。
「中途半端な状態」とは、どのようなものでしょう? DataReaderを使っていますか?それともDataAdapterを使いましたか? Oracleデータベースの文字コードセットは何にしましたか? | ||||||||||||
|
投稿日時: 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 ] | ||||||||||||
|
投稿日時: 2003-08-08 10:11
OleDbだけかもしれませんが、接続文字列におまじないがないような?
"…;PLSQLRSet=True"←OleDbでは、カーソルを開くために必要 それから、数字を受けるのは、Int32ではなくDecimalを使う方がいいみたいです。こちらの方が有効桁数が広いので。ただし、Oracleで表現可能なすべての文字が受けられるわけではありません(Oracleの文書に記載アリ)。 | ||||||||||||
|
投稿日時: 2003-08-08 10:44
Jittaさん、早速のご返答ありがとうございます。
>> "…;PLSQLRSet=True"←OleDbでは、カーソルを開くために必要 .NET Framework Data Provider for Oracleでは、下記のエラー出てしまいました。 『ハンドルされていない例外 : System.ArgumentException: サポートされていないキーワードです : 'plsqlrset'。』 OleDbでもPL/SQLが使用できるんですか? また、何かインストールする必要がありますか? 今までの方法で、どうしてもだめなようであれば、 OleDbを使用して作成しようかと思います。 | ||||||||||||
|
投稿日時: 2003-08-08 11:58
この組み合わせですが、MSDNの『OracleType列挙体』に、
とあるのは、お読みになりました? 『OracleDataReader クラス』の方で、REF CURSORを使ったサンプルがありますが、肝心の所は載っていませんねぇ。『使用できません』と言いながら、使用しているし。さすがマイクロソフトですねぇ。 とりあえず、デバッガで止めて、戻ってきている値の型を調べてみてください。もしかしたら、変な型になっているかもしれません。 OleDbでは、パラメータを指定せずに1つだけ受け取ることができるようです。すみません、ここ1ヶ月に調べたことなのに、忘れています。う〜ん、ここで以前書いたような?? ODP.NET(Oracleから提供されているもの)では、OracleRefCursorというクラスがあって、こいつで受けるようになっているようです。DataReaderをグリグリ回すのではなく、このクラスの中で回るようです。 | ||||||||||||
|
投稿日時: 2003-08-08 12:28
Jittaさんありがとうございます。
そうなんですよ。 『OracleDataReader クラス』を参考にして作成したのに・・・。 『OracleType列挙体』では、使用できませんなんて・・・。 悲しいです。
『OleDbDataReaderでストアドプロシージャで実行した検索結果を読み込みたい。』スレッドで、書き込んでいる内容ですね、きっと・・・?
DOS上で実行しているので、戻ってきている値の型はすみませんが知らべられません。 他の方法で、試してみます。 ありがとうございました。 |