続MSAccessでDBFlute

typeMappingMap.dfpropの設定

#; NUMERIC = $$AutoMapping$$ ; DECIMAL = $$AutoMapping$$

の行がデフォルトで有効になっているのでコメントアウト
定義ではDECIMAL(8)などにしていても、勝手にint?に変換されてしまいます。
DECIMALはdecimalでいきましょう。

MSAccessの日付型の対応

Quill+Accessの時に散々はまったくせに日付型の取り扱い方をすっかり忘れている。
DBFluteでも同じなんですね。

item.UpdatedDate = Datetime.Now;

なんてすると怒られます。
DbType.DateTimeの場合にOleDbType.Dateにしてあげないといけないやつですね。

class AccessDateTimeType : PrimitiveBaseType, IValueType { }

なクラスを作って

Seasar.Extension.ADO.Types.ValueTypes.RegisterValueType(typeof(DateTime), new AccessDateTimeType());
Seasar.Extension.ADO.Types.ValueTypes.RegisterValueType(typeof(Nullable), new AccessDateTimeType());

な感じで置き換えます。


以前はここで「なるほどね」、で終わったんですが、
http://s2container.net.seasar.org/ja/download.htmlで提供されている
Windows Form アプリケーション サンプル』がmdbを使用しているのを思い出しました。

これも同じような対応をしているんだろうなって思ってたんですが、
ソースを見る限り上記のような対応は一切行っていません。
なのに日付の項目に正常にinsert出来ています。


なんででしょう?


よく見ると"年"、"月"、"日"しか保存していません。
もしやと思い、日付の項目を

DateTime d = DateTime.Now;
item.UpdatedDate = new DateTime(d.Year, d.Month, d.Day);

にしてみると、上記の対応をしなくても問題なし!
では、

DateTime d = DateTime.Now;
item.UpdatedDate = new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second, d.Millisecond);

これはどうかというと、駄目らしい。
それじゃ、

DateTime d = DateTime.Now;
item.UpdatedDate = new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second);

ではこれだと、OKみたい。

要はAccessの日付型が秒までしかもてないから怒られてるんですね。
(ログ見るとSQLでは秒までになってるくせに)

ま、一つ謎が解けました。これ以上追うのはやめましょう。