在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
相关产品推荐
相关产品推荐

