- - PR -
OPDで文字項目に対するブランク文字列書き込みについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-02-05 13:45
VisualStudio2005 C#
Oracle 9i ODP.NET 上記の環境で開発を行っております。 Null値を許容するVerchar2の項目に対してOracleParameterにブランクの値を 格納した場合に、格納した値ではなくNullがセットされてしまいます。 以下は、そのときのコードの抜粋です。 // OracleCommandオブジェクト作成 OracleCommand mySQLCommand = new OracleCommand(); mySQLCommand.Connection = mDbConn; mySQLCommand.CommandText = "INSERT INTO OraChkNull(fld1,fld2) VALUES(:0001,:0002)"; //SQLパラメータの設定 { OracleParameter p = mySQLCommand.Parameters.Add("00001", OracleDbType.Decimal); p.Value = (v_C_long == null) ? (object)DBNull.Value : v_C_long; }; { OracleParameter p = mySQLCommand.Parameters.Add("00002", OracleDbType.Varchar2); if (v_C_string == null) { p.Value = (object)DBNull.Value; } else { p.Value = v_C_string; } }; //SQL実施 int ExecuteCount = mySQLCommand.ExecuteNonQuery(); 上記のfld2の方が該当する項目なのですが、ブランクおよび倍角のブランクもしくは それらが混在しているときに、NULLで更新されてしまうようです。 何か、解決方法をご存知の方はいらっしゃいませんでしょうか? |
|
投稿日時: 2007-02-05 19:42
長さゼロの文字列をnullとなるのは、
ODPが原因というよりOracleの仕様だからです。 ところで、 ・なぜ長さゼロの文字列を格納したいのでしょうか。 ・なぜ null ではいけないのでしょうか。 それがわかれば、代替案が出てくるかもしれませんよ。 |
|
投稿日時: 2007-02-06 01:43
ブランクというのは " " ですか?それとも "" ですか?
後者("")を格納するときに NULL になるのは masa さんもおっしゃっている通り Oracle だからです。 " " が NULL になるとしたらデータベースのフィールドが varchar2 などの可変長文字列だからだと思います。 _________________ かるあ のメモ と スニペット |
|
投稿日時: 2007-02-06 09:12
ちょっと、伝わりにくかったようで申し訳ありません。
長さゼロの文字列ではなく、空白です。 どうも、複数ブランクがこのページでワンブランクに縮小されるため上手く表現できませんが、' 'とか同様に連続したブランクが該当します。 ほかの環境で確認したわけではないのですが、Oracle Enterprise Managerから ワンブランクを入力したりすると正しく更新されるため、ODP固有の問題では と、思ったしだいです。 |
|
投稿日時: 2007-02-06 10:02
私もODP.NETを使っていますが、特に意識したことはありませんね。
今のプロジェクトでは「強制的にtrimして」という要望のため、 すぐに試すことはできないのですが、 スペースはあくまでもスペースとして格納されるという認識です。 パラメーターの値がどこかでtrimされているということはありませんか? また、もしパラメーターを生成するときにデータ型を指定していなければ、 型を指定してみるというのはどうでしょうか。 ↑ 設定されていましたね。ごめんなさい。 [ メッセージ編集済み 編集者: masa 編集日時 2007-02-06 10:14 ] |
1