- PR -

パラメータオブジェクトの使用方法

1
投稿者投稿内容
やんたん
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 63
投稿日時: 2003-08-24 23:09
お世話になっております。
現在オラクル社のデータプロバイダを使って
データアクセスに関するコードを勉強中です。
CommandText = "select * from tbl Where abc = :abc"
としてパラメータオブジェクトに
param1.ParameterName = "abc";
param1.OracleDbType = OracleDbType.Char;
param1.Size = 4;
param1.Value = "xyz";
cmd.Parameters.Add(param1);

としています。
すると下記のようなエラーが出てしまいました。
"ORA-00933: SQLコマンドが正しく終了されていません。"

パラメータの関連付けを行わず、直接記述したクエリは正常に
流れますので、やはりパラメータの関連付けだと思います。

どこか間違いをお気づきの方、アドバイスいただけると助かります。
よろしくお願いします。
はぐれコ〜ギ〜
常連さん
会議室デビュー日: 2003/06/12
投稿数: 32
投稿日時: 2003-08-25 09:39
やんたんさん、こんにちわ。
引用:

CommandText = "select * from tbl Where abc = :abc"


手元に環境がないので合ってるかわかりませんが・・・
「:abc」ではなく、「@abc」ではないでしょうか。
パラメータ指定するときは「@」だった気がします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-25 10:17
 あ〜、過去に「名前が付けられる」みたいなことを書いたような気がするが、、、
引用:

やんたんさんの書き込み (2003-08-24 23:09) より:
CommandText = "select * from tbl Where abc = :abc"


CommandText = "select * from tbl Where abc = :1"
だと、どうなります?

#"@abc"は、MSのSQL Serverとか、Pro*Cとか
Micky
大ベテラン
会議室デビュー日: 2002/09/04
投稿数: 137
投稿日時: 2003-08-25 17:46
みなさん、こんにちは。
Mickyです。
いつも勉強させていただいております。
特にJittaさんの親切な書込みにはいつも感激しております。

今はSQLServerを使っているのですが、興味があったので
ちょっと調べてみました。

Oracleの公式サンプルなんていうのも覗いてみたんですが、
SelectにWhereを付けている所は、全てパラメータを含んだ
文字列の編集で対応していました
ParameterオブジェクトはOutPutのみに使用されている様でした。
このプロバイダー、Parameteオブジェクトの文字列置き換え機能が
そもそも備わっているのでしょうか?

解答の書込みでなく申し訳ありませんが、
自分もぜひ知りたいと思いましたので・・・
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-26 08:46
引用:

Mickyさんの書き込み (2003-08-25 17:46) より:

このプロバイダー、Parameteオブジェクトの文字列置き換え機能が
そもそも備わっているのでしょうか?


 ODP.NETの資料が英文しかないので、苦労していますが・・・パラメータ文字は:1, :2, :3・・・と、OracleCommand.Parametersに追加する順序のようです。


ODP.NETをインストールするとMSDNにバインドされるマニュアルから引用

OracleParameter [] prm = new OracleParameter[3];

// Create OracleParameter objects through OracleParameterCollection
prm[0] = cmd.Parameters.Add("paramEmpno", OracleDbType.Decimal, 1234,
ParameterDirection.Input);
prm[1] = cmd.Parameters.Add("paramEname", OracleDbType.Varchar2,
"Client", ParameterDirection.Input);
prm[2] = cmd.Parameters.Add("paramDeptNo", OracleDbType.Decimal,
10, ParameterDirection.Input);

cmd.CommandText = "insert into emp(empno, ename, deptno) values(:1, :2, :3)";
cmd.CommandType = CommandType.CommandText;
cmd.ExecuteNonQuery();
...

ちゃんとInputもできます。
やんたん
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 63
投稿日時: 2003-08-26 08:59
みなさん貴重なご意見ありがとうございます。

いろいろ試してみた結果、下記のようなコードで通りました。

CommandText = "select * from tbl Where abc = abc"
としてパラメータオブジェクトに
param1.ParameterName = "abc";
param1.OracleDbType = OracleDbType.Char;
param1.Size = 4;
param1.Value = "xyz";
cmd.Parameters.Add(param1);

Jittaさんのおっしゃっている方法とは違うので、これで正しいのか
不安ですが・・・

ちなみに、日本語のリファレンスが下記にありました。
おそらくDLには会員登録が必要かと思います。
http://otn.oracle.co.jp/document/products/oracle9i/920/windows.html
Micky
大ベテラン
会議室デビュー日: 2002/09/04
投稿数: 137
投稿日時: 2003-08-26 09:29
Mickyです。

引用:
--------------------------------------------------------------------------------

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

ちゃんとInputもできます。

--------------------------------------------------------------------------------
そりゃそうですよね
なんせ、自分の見たサンプル全てが文字列編集で
やっていたんで、「??」になってしまいました。

又ひとつ勉強になりました。
ありがとうございました。m(__)m

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-26 09:42
確認しました。

 プレースホルダは、":name"と、名前を付けても、":1"と、Parametersに加える順番にしても動作しました。ただし、"name"は、動作しませんでした。やんたんさんの例だと、abc列が"xyz"の行を検索したいのだと思いますが、「abc列の内容=abc列の内容」と解釈され、すべての行が検索対象になっていると思います。


>なんせ、自分の見たサンプル全てが文字列編集で
>やっていたんで、「??」になってしまいました。

 文字列編集にしたいときもあるんですよね(^_^;。今やっているのは、両方使っています。本当はプレースホルダに統一したいのですが。。。
1

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