【问题标题】:Cast object type between C# and Oracle在 C# 和 Oracle 之间转换对象类型
【发布时间】:2019-06-23 09:06:06
【问题描述】:

我遇到了演员表的问题。我试图解决它几个小时。它与数据类型有关——Oracle 中的 raw 和 C# 中的 byte。它们似乎不兼容。

Oracle 中的函数

function dupCheck(i_vendor varchar2,i_transactionnumber varchar2) return raw
is
transactionId raw(16);

BEGIN

    select id into transactionId from (select tx.id,row_number() over (order by tx.trans_time asc) as seqnum
    from test_tx_log tx
    where tx.transactionnumber = i_transactionnumber and lower(tx.vendor) = lower(i_vendor)) tx where seqnum = 1;

    return transactionId;

    exception
    when no_data_found then
    return transactionId;
END;

C#

using (DbCommand command = connection.CreateCommand())
                {
                    command.CommandType = CommandType.StoredProcedure;
                    command.CommandText = "mca_test_package.dupCheck";
                    command.AddParameter("i_vendor", DbType.String, tx.Vendor);
                    command.AddParameter("i_transactionnumber", DbType.String, tx.TransactionNumber.Trim());
                    command.AddParameter("transactionId", DbType.Byte, DBNull.Value, ParameterDirection.ReturnValue,16);

                    command.ExecuteNonQuery();
                    var txId = new Guid((byte[])command.Parameters["transactionId"].Value);



                    byte[] buffer = new byte[16];
                    Guid id = new Guid(buffer);
                    bool result = (id == txId);

                    if (result)
                    {
                        tx.status = "Success";
                        Console.WriteLine("No Duplicate {0}", tx);

                    }
                    else
                    {
                        Console.WriteLine("Duplicate {0}", tx);
                        tx.status = "RejectedDuplicate";
                    }

得到错误

【问题讨论】:

  • command.Parameters["transactionId"].Value 获得了什么价值?
  • @ChetanRanpariya 我通过调试 Oracle 中的 dupCheck 函数得到 80A71EC73A864BE4E05400144FFA906A 的值。 Oracle中Id的数据类型为RAW(16 BYTE)
  • 根据Oracle data type mappingRAW应该映射到byte[]。由于输出参数返回DBNull,所以不能强制转换为byte[]
  • command.ExecuteNonQuery();下面添加这一行var test = command.Parameters["transactionId"].Value并在这一行添加断点并在调试模式下检查test变量中的值。
  • 您必须检查它是否为 null 。因为你从 RAW 得到 null

标签: c# oracle function types


【解决方案1】:

注意:我的假设是transactionid是一个输出参数。

transactionId 为空。所以你需要处理空值

if(!Convert.IsDBNull(command.Parameters["transactionId"].Value))
{

    var txId = new Guid((byte[])command.Parameters["transactionId"].Value);
}

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2013-08-29
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多