- PR -

ODP.NETによるパラメータオブジェクトの使用

1
投稿者投稿内容
RIZ
ベテラン
会議室デビュー日: 2003/11/05
投稿数: 61
投稿日時: 2003-11-05 18:22
はじめまして
ODP.NETによりデータベース処理を行っているのですが、
パラメータ指定の取得にて下記のエラーが発生してしまいます。
過去ログにもパラメータによる処理で似たような投稿があり、参考にして
パラメータ名を変えたりしたのですが、結果は同じでした。

テストコード
Dim Conn As New Oracle.DataAccess.Client.OracleConnection
Dim Cmd As New Oracle.DataAccess.Client.OracleCommand
Dim Param As New Oracle.DataAccess.Client.OracleParameter
Dim Read As Oracle.DataAccess.Client.OracleDataReader
Dim str As String

Conn.ConnectionString = "User Id=user;Password=password;Data Source=DATABASE1;"
Conn.Open()
Cmd.Connection = Conn
Cmd.CommandText = "SELECT DATA1 FROM AAA WHERE DATA2 = DATA2"

Param.ParameterName = "DATA2"
Param.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
Param.Value = "サンプル"
Param.Size = 10
Cmd.Parameters.Add(Param)

Read = odpCmd.ExecuteReader

str = Read("DATA1") ※


上記の※のデータ取得のところで、下記のエラーが発生してしまいます。

エラー:
"オブジェクトの現在の状態に問題があるため、操作は有効ではありません。"


Param.Direction = ParameterDirection.InputOutputの処理を追加したり
色々試したのですが、だめでした。
パラメータを使っていない、SQLで試したらその場合は問題なく処理されました。
原因は何なのでしょうか?
また、このパラメータ条件によるレコードはテーブルに存在しています。

分かりましたら、よろしくお願いいたします。
RIZ
ベテラン
会議室デビュー日: 2003/11/05
投稿数: 61
投稿日時: 2003-11-05 19:29
投稿者ですが、今色々と試していたら下記のような現象が発生しているようでした。

まず、取得部分のSQLを
SELECT DATA1 FROM AAA WHERE DATA2 = DATA2"

SELECT * FROM AAA WHERE DATA2 = DATA2"
に変更するとエラーが出ずに、取得部分まできました。
そして、再度
SELECT DATA1 FROM AAA WHERE DATA2 = DATA2"
へ戻したら、こんどはエラーが出ませんでした。
原因がよく分からないのですが・・・
こちらの記述ミスだったのかもしれません。

ただ、これでパラメータの指定値を変えたりして試すと、
条件に当てはまってないのに、str = Read("DATA1")にて
レコードが返ってきていました。
つまり、パラメータ条件を無視して、レコードを返してている
ような感じでした。

SELECT * FROM AAA WHERE DATA2 = :DATA2"
ただ、正式にはパラメータオブジェクトを使用する場合は上記のように
行うのですよね?
これで試すと、条件にあてはまっているのにレコードが返ってこなかったです。


それから、追加質問なのですが、これはコードを見て頂いてもわかるように
VB.NETにて作成しています。
VB.NETではデータ取得で
str = Read("DATA1")
とするとレコードのフィールドのデータを取れましたが、
C#の方だとこのようなやり方では
『Readは変数を意味しますが、メソッドでなければなりません』
と実行前にエラーがでてしまいます。

Readオブジェクトのメソッド(型はOracle.DataAccess.Client.OracleDataReaderです)
を見ると型による取得?のメソッドなど色々あったので試したのですが、どの
メソッドで取得しようとしても取得ができなかったです。
C#ではどのようにして取得すれば良いのでしょうか?
GetData、GetValueというメソッドがありましたが、どちらで試しても
ダメでした。
型による取得かと思い、GetChars等も試したのですが結果は同じでした。

質問が増えてすみません。
よろしくお願い致します。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2003-11-05 21:32
C#では
str = Read["DATA1"];
でいける気がするのですが。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-11-06 08:42
引用:

RIZさんの書き込み (2003-11-05 19:29) より:

SELECT * FROM AAA WHERE DATA2 = :DATA2"
ただ、正式にはパラメータオブジェクトを使用する場合は上記のように
行うのですよね?
これで試すと、条件にあてはまっているのにレコードが返ってこなかったです。


引用:

RIZさんの書き込み (2003-11-05 18:22) より:

Param.ParameterName = "DATA2"
Param.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Char
Param.Value = "サンプル"
Param.Size = 10
Cmd.Parameters.Add(Param)


 パラメータタイプにCharを指定しているからです。これは、サイズが10なので、
コード:

"サンプル "


か、
コード:

"サンプル "


となります。わかります?必ずサイズの長さ(バイト数か、文字数かは自信なし)の文字列になります。データベースの方もCHAR(10)ですか?VARCHAR2ではないですか?


引用:

型による取得かと思い、GetChars等も試したのですが結果は同じでした。


 型はあわせる必要があります。MSDNに対応表がありますから、対応する型で受けてください。

#くぅ〜!HTMLでは連続する空白を1文字の空白に置き換えて表示するのだった…

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-11-06 08:46 ]
RIZ
ベテラン
会議室デビュー日: 2003/11/05
投稿数: 61
投稿日時: 2003-11-07 01:24
burton999さん、Jittaさんありがとうございました。
str = Read["DATA1"];にて取得できました。
また、Char型だったのですがサイズ指定が間違っており
取得できていなかったようでした
サイズをあわせるとうまく行きました。
解決しました。ありがとうございました。
1

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