我很好奇这是否是 Oracle ODP.NET 提供程序中的错误。我创建了一个参数化的插入语句。我将其中一个参数命名为“:EMPNO”,并在测试时给它一个值“8000”。在数据库中,EMPNO 列被定义为 varchar2(4 字节)。但是,插入给出了错误消息
ORA-12899: 列 "HR"."HR_DEPARTURE"."EMPNO" 的值太大(实际值:6,最大值:4)
这是一些代码片段:
"INSERT INTO HR.HR_DEPARTURE (EMPNO) ':EMPNO'"
然后我添加一个参数
new OracleParameter(":EMPNO", OracleDbType.Varchar2) {Value = empNo ?? Convert.DBNull}
创建一个命令并添加参数(有多个参数因此数组)
DbCommand cmd = Connection.CreateCommand();
cmd.Parameters.AddRange(sqlParams.ToArray());
我做了一些研究并考虑了诸如编码之类的事情,以及 Oracle 默认按位置绑定(而不是 BindByName)这一事实。但是,这些都没有解决问题。然后我在黑暗中拍摄并将参数名称更改为“:EMPN”并收到以下错误消息:
ORA-12899: 列 "HR"."HR_DEPARTURE"."EMPNO" 的值太大(实际值:5,最大值:4)
这提示我将参数名称更改为“:EMP”,此时查询有效。我发现提供程序在 c# 中对参数名称强制执行数据库列大小很奇怪。数据库大小应该是值的强制执行('8000' 我在所有测试中都保持不变)。