Как получить значение из объекта OracleParameter - PullRequest
2 голосов
/ 08 января 2009

Как показано в приведенном ниже коде, я хочу получить значение из объекта OracleParameter. Тип данных: datetime.

...

Dim cmd As New OracleCommand("stored_proc_name", cnObject)
cmd.Parameters.Add("tran_date_out", OracleDbType.Date, ParameterDirection.Output)

...

cmd.ExecuteNonQuery()

...

Dim tranDate As Date
tranDate = cmd.Parameters("tran_date_out").Value

Когда я присваиваю значение переменной tranDate, я получаю сообщение об ошибке. Но если я кодирую, как показано ниже, я получаю только дату.

tranDate = CDate(cmd.Parameters("tran_date_out").Value.ToString)

Так как я могу получить значение даты и времени в переменную tranDate?

Ответы [ 2 ]

5 голосов
/ 08 января 2009

у меня в голове, OracleParameter.Value, когда выходной параметр присваивается странному коробочному типу Oracle. Это похоже на совершенно ужасный дизайн или часть Oracle ... но вместо возврата String вы получите OracleString и т. Д.

Каждый из типов Oracle имеет .Value, который имеет системный тип, но, конечно, они не все реализуют общий интерфейс для раскрытия этого, поэтому я в основном написал метод для распаковки типов: *

/// <summary>
/// The need for this method is highly annoying.
/// When Oracle sets its output parameters, the OracleParameter.Value property
/// is set to an internal Oracle type, not its equivelant System type.
/// For example, strings are returned as OracleString, DBNull is returned
/// as OracleNull, blobs are returned as OracleBinary, etc...
/// So these Oracle types need unboxed back to their normal system types.
/// </summary>
/// <param name="oracleType">Oracle type to unbox.</param>
/// <returns></returns>
internal static object UnBoxOracleType(object oracleType)
{
  if (oracleType == null)
    return null;

  Type T = oracleType.GetType();
  if (T == typeof(OracleString))
  {
    if (((OracleString)oracleType).IsNull)
      return null;
    return ((OracleString)oracleType).Value;
  }
  else if (T == typeof(OracleDecimal))
  {
    if (((OracleDecimal)oracleType).IsNull)
      return null;
    return ((OracleDecimal)oracleType).Value;
  }
  else if (T == typeof(OracleBinary))
  {
    if (((OracleBinary)oracleType).IsNull)
      return null;
    return ((OracleBinary)oracleType).Value;
  }
  else if (T == typeof(OracleBlob))
  {
    if (((OracleBlob)oracleType).IsNull)
      return null;
    return ((OracleBlob)oracleType).Value;
  }
  else if (T == typeof(OracleDate))
  {
    if (((OracleDate)oracleType).IsNull)
      return null;
    return ((OracleDate)oracleType).Value;
  }
  else if (T == typeof(OracleTimeStamp))
  {
    if (((OracleTimeStamp)oracleType).IsNull)
      return null;
    return ((OracleTimeStamp)oracleType).Value;
  }
  else // not sure how to handle these.
    return oracleType;
}

Возможно, это не самое чистое решение, но ... оно было быстрым и грязным, и оно работает для меня.

Просто передайте OracleParameter.Value в этот метод.


На самом деле, я мог бы только 1/2 прочитать ваш вопрос, прежде чем ответить. Я думаю, что тип даты Oracle содержит только дату, а не время.

Временная метка оракула имеет дату и время.

Надеюсь, это поможет! :)

0 голосов
/ 08 декабря 2015

Я не проверял много, но вот менее подробная версия ответа CodingWithSpike с использованием рефлексии ...

public static object UnBoxOracleType(object oracleType) {
    if(oracleType==null) {
        return null;
    }

    if((bool)oracleType.GetType().GetProperty("IsNull").GetValue(oracleType)) {
        return null;
    }
    return oracleType.GetType().GetProperty("Value").GetValue(oracleType);
}

Опять вы передаете OracleParameter.Value в этот метод.

Или для более безопасной версии вы можете сделать это:

public static object GetValue(OracleParameter param) {
    if(param == null || param.Value==null) {
        return null;
    }

    var oracleType=param.Value;

    if((bool)oracleType.GetType().GetProperty("IsNull").GetValue(oracleType)) {
        return null;
    }
    return oracleType.GetType().GetProperty("Value").GetValue(oracleType);
}

В этом случае вы должны передать сам параметр oracle, чтобы получить значение обратно. Это также может быть реализовано как метод расширения, если вы этого хотите ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...