- PR -

OracleのDate型フィールドにDbNull.ValueをInsertすると失敗する。

投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2007-05-12 01:00
動作確認を行っていたところ以下の事がわかりました。

1件目のデータがDbNull.Value
2件目のデータがNow  <--ここでエラーが発生する。

1件目のデータがDbNull.Value
2件目のデータがDbNull.Value
3件目のデータがNow  <--ここでエラーが発生する

1件目のデータがNow  
2件目のデータがDbNull.Value
3件目のデータがNow  この場合エラーは発生しない。

囚人さん
返答ありがとうございます。
1件目のデータがDbNull.Value
2件目のデータがNow  で正常に登録できたということでしょうか?


未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2007-05-12 01:05
何度も追加で申し訳ありません。

1件目のデータがDbNull.Value
2件目のデータがNow  <--ここでエラーが発生する。

上記の場合でもパラメータにDbType を設定することで正常に登録できました。
パラメータのDbTypeは明示的に設定したほうがよいとは思いますが
設定しなくても動作すると認識しておりました。

どう理解すればよいのかモヤが取れません。


Dim prm As New OracleClient.OracleParameter
prm = cmdInsert.CreateParameter
prm.DbType = DbType.Date    <−−追加
prm.ParameterName = "TESTDATE"
prm.SourceColumn = "TESTDATE"
cmdInsert.Parameters.Add(prm)
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-05-12 02:17
深く考えていませんが、最初の投稿のコードを SqlClient 対応して、成功コードとコメントアウトしてある失敗コードを一度ずつ実行しました。
_________________
囚人のジレンマな日々
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-05-12 02:22
saki1208です。

ヘルプのOracleParameter.DbType プロパティ の部分を確認すると、Valueを
設定するとDbTypeが決定されるとあります。

1回目にValueを設定したときのデータ型で判定され、2回目以降は型の
判定をしてないのでは?
毎回パラメータのインスタンスを作成>使用>破棄すれば、流れが同じ
でも成功したりしませんか?

#確か、oo4oでも同じような気が...>気のせいか?



[ メッセージ編集済み 編集者: saki1208 編集日時 2007-05-12 02:28 ]
shibamura
会議室デビュー日: 2003/01/22
投稿数: 4
投稿日時: 2007-05-12 14:23
 既に解決済みかもしれませんが...。

 Oracle の場合、初期化パラメータ SQL_TRACE に TRUE をセットすることで、SQL のログを取得することが出来ます。Oracle への接続後に、OracleCommand.ExecuteNonQuery メソッドで以下の SQL を実行してやれば良いと思います。

コード:
ALTER SESSION SET SQL_TRACE = TRUE;



 ログは同じく初期化パラメータ USER_DUMP_DEST で示されるフォルダに生成されますので、その値を事前に Oracle の管理ツールで確認しておいてください。
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2007-05-12 16:24
saki1208さん
返答ありがとうございます。

MSDNを確認したところ
「パラメータの DbType プロパティ、OracleType プロパティ、および .Data.OracleClient.OracleParameter.Size プロパティは、.Data.OracleClient.OracleParameter.Value を設定することによって推論できます。したがって、これらを指定する必要はありません。」とありました。
saki1208さんのご指摘のように1回目にValueを設定したときのデータ型で判定され、2回目以降は型の判定をしてないのでしょう。

OracleParameter.Value がDbNull.Valueの場合、OracleType プロパティはどのような型を推論するのでしょうか?

shibamuraさん
返答ありがとうございます。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2007-05-12 16:37
似たような問題がありましたので、ご参考までに。

  OracleParameter.Valueへ日付の配列

#以下、追記。

こんなのもありました。

  Oracle Data Provider for .NET開発者ガイド


[ メッセージ編集済み 編集者: ひろれい 編集日時 2007-05-12 16:42 ]
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-05-12 16:54
saki1208です。

引用:

未記入さんの書き込み (2007-05-12 16:24) より:
saki1208さん
OracleParameter.Value がDbNull.Valueの場合、OracleType プロパティはどのような型を推論するのでしょうか?



追記:見当違いの回答をしてました...orz
DbType.AnsiString が規定値であるとの記述はありますが...

DbNullを設定するのであれば、あらかじめOracleParameter.DbTypeを指定する
必要があると思います。
#パラメータに設定する値(の型)ではなく、該当箇所のDBのフィールドの型を
#設定するのではないでしょうか。
#少なくとも、oo4oではそうです。

#DbNullを設定したときに推論される型がDate型ではないために、2回目以降で
#日付を設定したときにエラーになるのではないでしょうか?
#oo4oでは、Nullの指定がOK/NGもパラメータのプロパティに設定する必要があ
#りましたが...

#OracleParameter.IsNullable プロパティ が該当しそうです。



[ メッセージ編集済み 編集者: saki1208 編集日時 2007-05-12 16:58 ]

[ メッセージ編集済み 編集者: saki1208 編集日時 2007-05-12 17:02 ]

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