- - PR -
ODP.NETによるパラメータオブジェクトの使用
1
| 投稿者 | 投稿内容 | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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で試したらその場合は問題なく処理されました。 原因は何なのでしょうか? また、このパラメータ条件によるレコードはテーブルに存在しています。 分かりましたら、よろしくお願いいたします。 | ||||||||||||||||||||
|
投稿日時: 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等も試したのですが結果は同じでした。 質問が増えてすみません。 よろしくお願い致します。 | ||||||||||||||||||||
|
投稿日時: 2003-11-05 21:32
C#では
str = Read["DATA1"]; でいける気がするのですが。 | ||||||||||||||||||||
|
投稿日時: 2003-11-06 08:42
パラメータタイプにCharを指定しているからです。これは、サイズが10なので、
か、
となります。わかります?必ずサイズの長さ(バイト数か、文字数かは自信なし)の文字列になります。データベースの方もCHAR(10)ですか?VARCHAR2ではないですか?
型はあわせる必要があります。MSDNに対応表がありますから、対応する型で受けてください。 #くぅ〜!HTMLでは連続する空白を1文字の空白に置き換えて表示するのだった… [ メッセージ編集済み 編集者: Jitta 編集日時 2003-11-06 08:46 ] | ||||||||||||||||||||
|
投稿日時: 2003-11-07 01:24
burton999さん、Jittaさんありがとうございました。
str = Read["DATA1"];にて取得できました。 また、Char型だったのですがサイズ指定が間違っており 取得できていなかったようでした サイズをあわせるとうまく行きました。 解決しました。ありがとうございました。 | ||||||||||||||||||||
1
