[seasar-dotnet:578] Re: MDB に日付 / 時刻型の列に日付時刻を挿入できない
[E-MAIL ADDRESS DELETED]
[E-MAIL ADDRESS DELETED]
2007年 8月 10日 (金) 13:39:37 JST
宮城様
近藤です。
返信ありがとうございます。
OleDbで他のデータベースに接続した場合の事は考えていませんでした。
提示いただいた
> Seasar.Extension.ADO.Types.ValueTypes.RegisterValueType(
> typeof(DateTime),
> new AccessDateTimeType()
> );
で対応しようと思います。
助かりました。
ありがとうございました。
--- Ryo Miyagi <[E-MAIL ADDRESS DELETED]> wrote:
> 宮城です。
>
> 対応予定が無いという点について説明が足りず申し訳ありません。
>
> Seasar.NETに取り込まない理由は、
> OleDbCommandの時にDbType.DateTime→OleDbType.Dateに変換するロジックを組み込むと
> MDB以外の接続(例:DB2, SQL Server等)でOleDbCommandを使用したときに
> 日付/時刻型の精度が切り捨てられる可能性があるためです。
>
> OleDbCommandの時にDbType.DateTime→OleDbType.VarCharに変換するロジックは、
> DB2接続時にデータ型を正しく認識できないのが原因で組み込んだと思います。
> この場合、OleDbType.VarCharに変換しても他DBへの影響が少ないので残しています。
>
> もし、Seasar.NETにパッチを当てることが難しいのであれば、
> Seasar.Extension.ADO.Types.IValueTypeを実装したデータ型変換用のクラスを
> 作成することで対応できるかと思います。
>
> 例えば、OleDbType.Dateに変換するロジックを組み込んだ
> AccessDateTimeTypeクラス(添付ファイル参照)を作成し、
> プログラム起動時のMain()メソッドあたりで
>
> Seasar.Extension.ADO.Types.ValueTypes.RegisterValueType(
> typeof(DateTime),
> new AccessDateTimeType()
> );
>
> を呼び出します。
>
>
>
> このような各DB毎の差異をSeasar.NETでどこまで吸収するか難しいところですが、
> 容易に変更できる作りにはしておきたいと思います。
> もしくは、OleDbCommandのラッパークラスを作成してDB毎の差異を吸収したほうがいいかも。
>
> 以上
>
> > 近藤です。
> >
> > 宮城様、早速の回答ありがとうございます。
> >
> > おっしゃるとおりに修正し、リコンパイルしたら正常に動作いたしました。
> > ありがとうございます。
> >
> > ただ、対応予定がないと言うことが残念です。
> > ソース修正時に、同じようにOleDbCommandのときString→OleDbType.VarCharに変換するロジックを
> > 見かけました。
> > 同じ用に対応して頂けることを希望します。
> >
> > ありがとうございました。
> >
> > --- Ryo Miyagi <[E-MAIL ADDRESS DELETED]> wrote:
> >
> > > 宮城です。
> > >
> > > 近藤さん、はじめまして。
> > >
> > > 解決策としては、
> > > Seasar.Extension.ADO.Types.BaseValueTypeクラスのBindValueメソッドに
> > > 次のソースを追加してください。
> > >
> > > if ("OleDbCommand".Equals(cmd.GetType().Name) && dbType == DbType.DateTime)
> > > {
> > > // DbType.DateTimeを指定するとOleDbType.DBTimeStampを指定したことになり、
> > > // JETでは認識できない。
> > > // そのため、OleDbType.Dateを明示的に指定する。
> > > OleDbParameter oleDbParam = parameter as OleDbParameter;
> > > oleDbParam.OleDbType = OleDbType.Date;
> > > }
> > >
> > > 上記のソースは、
> > > MDBとの接続アダプタであるJETがデータ型を正しく認識できないのが原因と思われるので
> > > 今のところ、Seasar.NETに取り込む予定はありません。
> > >
> > > 以上です
> > >
> > >
> > > > はじめまして、近藤と申します。
> > > >
> > > > MDBをデータベースとしてS2Dao.Netを利用しています。
> > > > 今までOracleでは、なんら問題なく使えていたのですが、
> > > >
> > > > 日付/時刻型の列にDateTime.Nowを挿入しようとすると以下のエラーが出ます。
> > > > [ESSR0071]SQLで例外が発生しました。理由はSystem.Data.OleDb.OleDbException:
> > > 抽出条件でデータ型が一致
> > > > しません。
> > > >
> > > > DateTime.Todayでは大丈夫のようです。
> > > >
> > > > 本来は、TimestampProperty属性で排他制御を行わせたいと考えていたのですが
> > > > Mdbの日付/時刻型に時間を持った値をセットできないため困っています。
> > > > 何か解決策があるのでしょうかお教え下さい。
> > > >
> > > > 再現方法は、http://codezine.jp/a/article/aid/805.aspxにあるサンプルをダウンロードし、
> > > > Program.csのbook.Editdate = DateTime.Today;の部分をbook.Editdate = DateTime.Now;
> > > > にしたら再現すると思います。
> > > >
> > > > 環境は、
> > > > Windows XP Professional SP2
> > > > Visual Studio 2005 Professional SP1
> > > > S2Dao.Net 1.0.1と1.1.0で確認
> > > >
> > > > 以上 よろしくお願いします。
> > > >
> > > >
> > > > _______________________________________________
> > > > seasar-dotnet mailing list
> > > > [E-MAIL ADDRESS DELETED]
> > > > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> > >
> > >
> > > _______________________________________________
> > > seasar-dotnet mailing list
> > > [E-MAIL ADDRESS DELETED]
> > > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> > >
> >
> > _______________________________________________
> > seasar-dotnet mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
> > _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
seasar-dotnet メーリングリストの案内