2011-03-16 11 views
1

私はメモリ内のSQLiteを使用して自分のアプリケーションにいくつかのユニットテストを実行しようとしてるから取り出さ一致しませんが、私は奇妙な問題に遭遇しました:SQLiteはC#のDateTimeがデータベース

私は2つのクエリを持っています。最初の結果は、指定されたリスト名の最新の価格リストの日付であり、最新の価格を取得するためには、DateTimeが2番目のクエリで使用されます。問題は、2番目のクエリが結果を返さないことです。

バックグラウンドで何が問題になるのでしょうか?

 var effective = DbSession.Current.CreateCriteria<ItemPrice>() 
       .SetProjection(Projections.Max("Effective")) 
       .Add(Restrictions.Le("Effective", workDate)) 
       .CreateCriteria("PriceList") 
       .Add(Restrictions.Eq("ListName", listName)) 
       .Add(Restrictions.Eq("Active", true)) 
       .UniqueResult<DateTime>(); 

     return DbSession.Current.CreateCriteria<ItemPrice>() 
      .Add(Restrictions.Eq("Effective", effective)) 
      .CreateCriteria("PriceList") 
      .Add(Restrictions.Eq("ListName", listName)) 
      .Add(Restrictions.Eq("Active", true)) 
      .List<ItemPrice>(); 

結果:文字列として日時を保存するために、カスタムIUserTypeを実装することになった、と(以下含まれている)、それを使用するDateTimeのための流暢自動マッピング規則を追加:

class SQLiteDateTime : IUserType 
    { 
     #region IUserType Members 

     public object Assemble(object cached, object owner) 
     { 
      return cached; 
     } 

     public object DeepCopy(object value) 
     { 
      var dt = (DateTime) value; 
      return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second); 
     } 

     public object Disassemble(object value) 
     { 
      return String.Format("{0:yyyy'-'MM'-'dd' 'HH':'mm':'ss.fff}", value); 
     } 

     public new bool Equals(object x, object y) 
     { 
      return x.Equals(y); 
     } 

     public int GetHashCode(object x) 
     { 
      return x.GetHashCode(); 
     } 

     public bool IsMutable 
     { 
      get { return false; } 
     } 

     public object NullSafeGet(IDataReader rs, string[] names, object owner) 
     { 
      string dateString = (string)NHibernateUtil.String.NullSafeGet(rs, names[0]); 
      DateTime result = DateTime.ParseExact(dateString, "yyyy'-'MM'-'dd' 'HH':'mm':'ss.fff", CultureInfo.InvariantCulture.DateTimeFormat); 

      return result; 
     } 

     public void NullSafeSet(IDbCommand cmd, object value, int index) 
     { 
      if (value == null) 
      { 
       NHibernateUtil.String.NullSafeSet(cmd, null, index); 
       return; 
      } 
      value = Disassemble(value); 
      NHibernateUtil.String.NullSafeSet(cmd, value, index); 
     } 

     public object Replace(object original, object target, object owner) 
     { 
      return original; 
     } 

     public Type ReturnedType 
     { 
      get { return typeof (DateTime); } 
     } 

     public NHibernate.SqlTypes.SqlType[] SqlTypes 
     { 
      get { 
      var types = new SqlType[1]; 
      types[0] = new SqlType(DbType.String); 
      return types; 
      } 
     } 

     #endregion 
    } 
+0

結果はコンパイルされません。エラーを生成するdateStringはNullSafeGetを呼び出すときに定義されていません。 –

+0

おかげさまで、サンプルIUserTypeから無関係なコメントを取り除いて少し過激になったようです。 –

答えて

1

を設定してみてくださいその列のタイムスタンプのCustomType。ミリ秒を節約するかどうかの違いです。

+0

それはうまくいかないようでしたが、私を正しい方向に向けることに感謝します。 –

関連する問題