You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中使用Oracle.ManagedDataAccess.Client更新VARRAY列报错

解决C#中Oracle.ManagedDataAccess更新VARRAY类型列的问题

错误原因分析

第一个错误(ORA-00932: 数据类型不一致:应为HCODE_ARRAY,却获得CHAR)

原代码仅指定了UdtTypeName,但未将参数的OracleDbType设置为Array,导致ODP.NET无法识别该参数为Oracle集合类型,错误地将传入的string数组解析为普通字符串类型。

第二个错误(ORA-22814: 属性或元素值大于类型中指定的大小)

将多个元素拼接成单个字符串传入参数,Oracle会把这个完整字符串当作VARRAY的单个元素处理,而该字符串长度远超过了HCODE_ARRAY定义中varchar2(4)的长度限制,因此触发元素值过长的错误。

正确实现代码

需要明确指定参数的OracleDbType为Array,并正确关联自定义VARRAY类型(注意如果类型属于特定schema,需写全schema名称):

OracleCommand cmd2 = new OracleCommand(
    "update mytable set hcodes = :hcodes where ich = 'xxx'", ora);

var hcodesParam = new OracleParameter
{
    ParameterName = ":hcodes",
    OracleDbType = OracleDbType.Array,
    UdtTypeName = "scrpt_app.HCODE_ARRAY", // 替换为实际的schema.类型名
    Value = new string[] { "ABCD", "DEFG" }
};

cmd2.Parameters.Add(hcodesParam);
cmd2.ExecuteNonQuery();

关键说明

  • 必须设置OracleDbType = OracleDbType.Array,告知ODP.NET该参数对应Oracle集合类型
  • UdtTypeName需准确匹配数据库中定义的VARRAY类型名,包含schema前缀(如果类型不属于当前连接用户的默认schema)
  • 直接传入符合元素类型的.NET数组(如string[])即可,ODP.NET会自动完成与Oracle VARRAY的类型映射

内容的提问来源于stack exchange,提问作者Mark Ainsworth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 22:12:27