- PR -

OPDで文字項目に対するブランク文字列書き込みについて

1
投稿者投稿内容
とら
ベテラン
会議室デビュー日: 2006/10/04
投稿数: 54
投稿日時: 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で更新されてしまうようです。

何か、解決方法をご存知の方はいらっしゃいませんでしょうか?
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2007-02-05 19:42
長さゼロの文字列をnullとなるのは、
ODPが原因というよりOracleの仕様だからです。

ところで、

・なぜ長さゼロの文字列を格納したいのでしょうか。
・なぜ null ではいけないのでしょうか。

それがわかれば、代替案が出てくるかもしれませんよ。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-02-06 01:43
ブランクというのは " " ですか?それとも "" ですか?
後者("")を格納するときに NULL になるのは masa さんもおっしゃっている通り Oracle だからです。
" " が NULL になるとしたらデータベースのフィールドが varchar2 などの可変長文字列だからだと思います。
_________________
かるあ のメモスニペット
とら
ベテラン
会議室デビュー日: 2006/10/04
投稿数: 54
投稿日時: 2007-02-06 09:12
ちょっと、伝わりにくかったようで申し訳ありません。

長さゼロの文字列ではなく、空白です。
どうも、複数ブランクがこのページでワンブランクに縮小されるため上手く表現できませんが、' 'とか同様に連続したブランクが該当します。

ほかの環境で確認したわけではないのですが、Oracle Enterprise Managerから
ワンブランクを入力したりすると正しく更新されるため、ODP固有の問題では
と、思ったしだいです。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2007-02-06 10:02
私もODP.NETを使っていますが、特に意識したことはありませんね。

今のプロジェクトでは「強制的にtrimして」という要望のため、
すぐに試すことはできないのですが、
スペースはあくまでもスペースとして格納されるという認識です。

パラメーターの値がどこかでtrimされているということはありませんか?

また、もしパラメーターを生成するときにデータ型を指定していなければ、
型を指定してみるというのはどうでしょうか。

設定されていましたね。ごめんなさい。



[ メッセージ編集済み 編集者: masa 編集日時 2007-02-06 10:14 ]
1

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