2011-03-04 57 views

回答

1

只需編寫一個自定義IEnhancedUserType即可轉換爲字符串表示形式或從字符串表示形式轉換而來。

這樣它將對您的應用程序透明。

+0

感謝迭戈,它似乎我在找什麼。我會試着弄清楚它是如何工作的。 – LeftyX 2011-03-06 10:44:30

+0

我沒有使用過你的解決方案,因爲我已經看到從IUserType派生出來的IEnhancedUserType,這個很簡單。我已經嘗試過實現,並且它可以工作,即使我沒有能夠以書寫模式進行測試。我會接受你的解決方案。 – LeftyX 2011-03-07 14:32:10

+0

@LeftyX:是的,實際上IUserType對於大多數情況已經足夠了。 – 2011-03-07 14:39:02

0

最近我面臨着同樣的問題,結束了寫下面的方法:

public static DateTime? ConvertFromOracleDate(object oracleDate) 
    { 
     if (oracleDate == null) 
      throw new ArgumentNullException("oracleDate"); 

     if (!(oracleDate is string)) 
      throw new ArgumentException("oracleDate"); 

     var sDate = (string) oracleDate; 

     if (sDate.Equals(String.Empty)) 
      return null; 

     if (sDate.Length != 8) 
      throw new ArgumentOutOfRangeException("oracleDate"); 

     sDate = sDate.Insert(6, "/"); 
     sDate = sDate.Insert(4, "/"); 
     var ci = new CultureInfo("en-US"); 

     return Convert.ToDateTime(sDate, ci); 
    } 

希望這有助於。

-1

您也可以使用

TO_DATE(TO_CHAR(semi_date_field),'yyyymmdd')) 

然後你會選擇用Oracle的數據類型DATE列做您的SQL查詢的轉變。 C#無疑將這些視爲日期時間。

Regards,
Rob。

0

完成編寫自定義IUserType
對於這裏感興趣的是代碼。我還沒有嘗試寫入過程,導致我的表是隻讀在這一刻:

public class DecimalToDateUserType : IUserType 
{ 
    public object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     int? result = (int)NHibernateUtil.Int32.NullSafeGet(rs, names[0]); 
     if ((result != null)&&(result.Value>0)) 
     { 
      var sDate = result.Value.ToString(); 
      sDate = sDate.Insert(6, "/").Insert(4, "/"); 
      var ci = new CultureInfo("en-US"); 

      return Convert.ToDateTime(sDate, ci); 
     } 
     return (DateTime.MinValue); 
    } 

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

     if ((DateTime)value == DateTime.MinValue) 
     { 
      value = 0; 
      NHibernateUtil.Int32.NullSafeSet(cmd, value, index); 
      return; 
     } 

     int convertedValue = 0; 
     int.TryParse(((DateTime)value).ToString("yyyyMMdd"), out convertedValue); 

     value = convertedValue; 

     NHibernateUtil.Int32.NullSafeSet(cmd, value, index); 
    } 

    public object DeepCopy(object value) 
    { 
     if (value == null) return null; 
     return (value); 
    } 

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

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

    public object Disassemble(object value) 
    { 
     return DeepCopy(value); 
    } 

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

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

    public bool IsMutable 
    { 
     get { return false; } 
    } 

    public new bool Equals(object x, object y) 
    { 
     if (x == null || y == null) return false; 
     return x.Equals(y); 
    } 

    public int GetHashCode(object x) 
    { 
     return x.GetHashCode(); 
    } 
} 
相關問題