sql >> データベース >  >> RDS >> Oracle

C#でOracleタイムスタンプを解析できません

    ODP.NETの使用を開始すると、次のような拡張機能を実装する必要がありました。

    public static T ConvertOracleValue<T>(this object value)
    {
         if (value != null)
         {
              Type typeOfValue = value.GetType();
    
              if (typeOfValue.Namespace.Contains("Oracle.DataAccess"))
              {
                  if (typeOfValue.Name.Equals("OracleTimeStamp"))
                  {
                       int tempInt = 0;
                       Oracle.DataAccess.Types.OracleTimeStamp ots = (Oracle.DataAccess.Types.OracleTimeStamp)value;
                       tempInt = Int32.TryParse(ots.Millisecond.ToString("000").Substring(0, 3), out tempInt) ? tempInt : 0;
                       DateTime ret = new DateTime(ots.Year, ots.Month, ots.Day, ots.Hour, ots.Minute, ots.Second, tempInt);
                        return ConvertHelper.ConvertValue<T>(ret);
                  }
                  if (typeOfValue.Name.Equals("OracleTimeStampLTZ"))
                  {
                        int tempInt = 0;
                        Oracle.DataAccess.Types.OracleTimeStampLTZ ots = (Oracle.DataAccess.Types.OracleTimeStampLTZ)value;
                        tempInt = Int32.TryParse(ots.Millisecond.ToString("000").Substring(0, 3), out tempInt) ? tempInt : 0;
                        DateTime ret = new DateTime(ots.Year, ots.Month, ots.Day, ots.Hour, ots.Minute, ots.Second, tempInt);
                        return ConvertHelper.ConvertValue<T>(ret);
                  }
                  if (typeOfValue.Name.Equals("OracleTimeStampTZ"))
                  {
                        int tempInt = 0;
                        Oracle.DataAccess.Types.OracleTimeStampTZ ots = (Oracle.DataAccess.Types.OracleTimeStampTZ)value;
                        tempInt = Int32.TryParse(ots.Millisecond.ToString("000").Substring(0, 3), out tempInt) ? tempInt : 0;
                        DateTime ret = new DateTime(ots.Year, ots.Month, ots.Day, ots.Hour, ots.Minute, ots.Second, tempInt);
                        return ConvertHelper.ConvertValue<T>(ret);
                  }
    
                  string temp = value.ToString();
                  return ConvertHelper.ConvertValue<T>(temp);
              }
          }
          else
          {
               return default(T);
          }
    
          return ConvertHelper.ConvertValue<T>(value);
    }
    

    ここで、ConvertHelper.ConvertValueは別の拡張機能です:

    public static class ConvertHelper
        {
            public static T ConvertValue<T>(object value)
            {
                Type typeOfT = typeof(T);
                if (typeOfT.BaseType != null && typeOfT.BaseType.ToString() == "System.Enum")
                {
                    return (T)Enum.Parse(typeOfT, Convert.ToString(value));
                }
                if ((value == null || value == Convert.DBNull) && (typeOfT.IsValueType))
                {
                    return default(T);
                }
                if (value is IConvertible)
                {
                    return (T)Convert.ChangeType(value, typeOfT, new CultureInfo("en-GB"));
                }
    
                return (T)Convert.ChangeType(value, typeOfT);
            }
    }
    

    これは、テスト、統合、本番環境で魅力のように機能しました。



    1. mysql-connectorpython'IN'演算子がリストとして保存されます

    2. SQL Serverデータベースの回復保留状態を修正するにはどうすればよいですか?

    3. Postgresウィンドウ関数とgroupby例外

    4. [更新された2020-01-23]MicrosoftOffice365ビルド1912はODBCリンクテーブルのIDを破壊します