gpt4 book ai didi

vb.net - 如何从 OracleParameter 对象获取值

转载 作者:行者123 更新时间:2023-12-02 01:23:12 27 4
gpt4 key购买 nike

如下面所示的代码,我想从 OracleParameter 对象获取值。它的数据类型是日期时间。

...

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 变量的日期和时间值呢?

最佳答案

我突然想到,当输出参数时,OracleParameter.Value 被分配给一个奇怪的 Oracle 装箱类型。这似乎是一个完全糟糕的设计或 Oracle 的部分...但是您将得到 OracleString 等,而不是返回 String。

每个 Oracle 类型都有一个具有系统类型的 .Value,但当然它们并不都实现一个公共(public)接口(interface)来公开它,所以我所做的基本上是编写一个方法来拆箱类型:

/// <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的Date类型只包含日期而不包含时间。

oracle 类型 Timestamp 既有日期又有时间。

希望有帮助! :)

关于vb.net - 如何从 OracleParameter 对象获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/423182/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com