不一致的数据类型预期CLOB但得到char

时间:2016-11-15 07:06:26

标签: c# oracle11g ado.net

我想用C#中的ado.net更新CLOB数据类型,但我不知道如何将字符串数据类型(在C#中)与CLOB数据类型(在oracle中)匹配:

public static DBOperation updateMasterChild(MasterChild v_child = null, List<MasterChild> childRen = null)
    {
        if (v_child == null && childRen == null)
            throw new ValidationFailedException("Must contain one MasterChild object for updating at least.");
        if (childRen == null)
        {
            childRen = new List<MasterChild>();
        }

        if (v_child != null)
            childRen.Add(v_child);

        OracleDataAdapter da = new OracleDataAdapter();
        StringBuilder sb = new StringBuilder();
        sb = sb.Append(" update MSWSCEMASTERCHILD set ticket_id = case when :ticket_id_1 is null then ticket_id else :ticket_id end,");
        sb = sb.Append(" LONGREFERENCEDATA = case when :LONGREFERENCEDATA_1 is null then LONGREFERENCEDATA else :LONGREFERENCEDATA end ");
        sb = sb.Append(" where id = :id and step_count = :step_count ");

        using (OracleConnection oraC = new OracleConnection(conStr))
        {
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = oraC;
            cmd.CommandText = sb.ToString();

            oraC.Open();
            cmd.Transaction = oraC.BeginTransaction();

            try
            {
                foreach (MasterChild child in childRen)
                {
                    cmd.Parameters.Clear();

                    cmd.Parameters.AddWithValue(":ticket_id_1", child.TicketId);
                    cmd.Parameters.AddWithValue(":ticket_id", child.TicketId);

                    cmd.Parameters.AddWithValue(":LONGREFERENCEDATA_1", child.LONGREFERENCEDATA);
                    cmd.Parameters.AddWithValue(":LONGREFERENCEDATA", child.LONGREFERENCEDATA);

                    cmd.Parameters.AddWithValue(":id", child.Id);
                    cmd.Parameters.AddWithValue(":step_count", child.StepCount);

                    cmd.ExecuteNonQuery();
                }
                cmd.Transaction.Commit();
            }
            catch (Exception ex)
            {
                cmd.Transaction.Rollback();
                throw ex;
            }
        }
        return DBOperation.Success;
    }

oracle中的LONGREFERENCEDATA是CLOB类型,子对象中的属性LONGREFERENCEDATA是字符串,如果我删除此字段的更新,则可以,但是如果我写了更新包含CLOB字段,则失败,并获得异常:预期CLOB但得到了char。

我不知道为什么以及如何解决这个问题。你能帮忙提供一些建议或解决方案吗?

1 个答案:

答案 0 :(得分:0)

使用CLOB Oracle数据并不像基础数据类型那么简单。有关ADO.NET中读/写Oracle CLOB数据的示例,请参阅此link

相关问题