- - PR -
OracleのDate型フィールドにDbNull.ValueをInsertすると失敗する。
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 で正常に登録できたということでしょうか? | ||||
|
投稿日時: 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) | ||||
|
投稿日時: 2007-05-12 02:17
深く考えていませんが、最初の投稿のコードを SqlClient 対応して、成功コードとコメントアウトしてある失敗コードを一度ずつ実行しました。
_________________ 囚人のジレンマな日々 | ||||
|
投稿日時: 2007-05-12 02:22
saki1208です。
ヘルプのOracleParameter.DbType プロパティ の部分を確認すると、Valueを 設定するとDbTypeが決定されるとあります。 1回目にValueを設定したときのデータ型で判定され、2回目以降は型の 判定をしてないのでは? 毎回パラメータのインスタンスを作成>使用>破棄すれば、流れが同じ でも成功したりしませんか? #確か、oo4oでも同じような気が...>気のせいか? [ メッセージ編集済み 編集者: saki1208 編集日時 2007-05-12 02:28 ] | ||||
|
投稿日時: 2007-05-12 14:23
既に解決済みかもしれませんが...。
Oracle の場合、初期化パラメータ SQL_TRACE に TRUE をセットすることで、SQL のログを取得することが出来ます。Oracle への接続後に、OracleCommand.ExecuteNonQuery メソッドで以下の SQL を実行してやれば良いと思います。
ログは同じく初期化パラメータ USER_DUMP_DEST で示されるフォルダに生成されますので、その値を事前に Oracle の管理ツールで確認しておいてください。 | ||||
|
投稿日時: 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さん 返答ありがとうございます。 | ||||
|
投稿日時: 2007-05-12 16:37
似たような問題がありましたので、ご参考までに。
OracleParameter.Valueへ日付の配列 #以下、追記。 こんなのもありました。 Oracle Data Provider for .NET開発者ガイド [ メッセージ編集済み 編集者: ひろれい 編集日時 2007-05-12 16:42 ] | ||||
|
投稿日時: 2007-05-12 16:54
saki1208です。
追記:見当違いの回答をしてました...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 ] |