- - PR -
パラメータオブジェクトの使用方法
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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-08-25 09:39
やんたんさん、こんにちわ。
手元に環境がないので合ってるかわかりませんが・・・ 「:abc」ではなく、「@abc」ではないでしょうか。 パラメータ指定するときは「@」だった気がします。 | ||||
|
投稿日時: 2003-08-25 10:17
あ〜、過去に「名前が付けられる」みたいなことを書いたような気がするが、、、
CommandText = "select * from tbl Where abc = :1" だと、どうなります? #"@abc"は、MSのSQL Serverとか、Pro*Cとか | ||||
|
投稿日時: 2003-08-25 17:46
みなさん、こんにちは。
Mickyです。 いつも勉強させていただいております。 特にJittaさんの親切な書込みにはいつも感激しております。 今はSQLServerを使っているのですが、興味があったので ちょっと調べてみました。 Oracleの公式サンプルなんていうのも覗いてみたんですが、 SelectにWhereを付けている所は、全てパラメータを含んだ 文字列の編集で対応していました ParameterオブジェクトはOutPutのみに使用されている様でした。 このプロバイダー、Parameteオブジェクトの文字列置き換え機能が そもそも備わっているのでしょうか? 解答の書込みでなく申し訳ありませんが、 自分もぜひ知りたいと思いましたので・・・ | ||||
|
投稿日時: 2003-08-26 08:46
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-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 | ||||
|
投稿日時: 2003-08-26 09:29
Mickyです。
引用: -------------------------------------------------------------------------------- Jitta さんの書き込み (2003-08-26 08:46) より: ちゃんとInputもできます。 -------------------------------------------------------------------------------- そりゃそうですよね なんせ、自分の見たサンプル全てが文字列編集で やっていたんで、「??」になってしまいました。 又ひとつ勉強になりました。 ありがとうございました。m(__)m | ||||
|
投稿日時: 2003-08-26 09:42
確認しました。
プレースホルダは、":name"と、名前を付けても、":1"と、Parametersに加える順番にしても動作しました。ただし、"name"は、動作しませんでした。やんたんさんの例だと、abc列が"xyz"の行を検索したいのだと思いますが、「abc列の内容=abc列の内容」と解釈され、すべての行が検索対象になっていると思います。 >なんせ、自分の見たサンプル全てが文字列編集で >やっていたんで、「??」になってしまいました。 文字列編集にしたいときもあるんですよね(^_^;。今やっているのは、両方使っています。本当はプレースホルダに統一したいのですが。。。 |
1