使用Visual Studio插入数据时遭遇ORA-00913: 值过多错误
问题原因及解决方案
错误根源
ORA-00913: too many values 是因为你的INSERT语句中VALUES子句的数值数量和目标表指定的字段数量不匹配:
- 目标表
USER_TABLE_STAGE指定了16个字段,但VALUES里实际写了17个参数(数逗号分隔的项就能发现)。 - 同时参数编号混乱,存在重复(如
:val6、:val1、:val3各出现两次)和遗漏(未使用:val11),既导致数量超出,也会造成字段值对应错误。
修正步骤
1. 修正INSERT语句
将VALUES子句调整为16个唯一参数,与字段一一对应:
using (OracleCommand insertCommand = new OracleCommand( "INSERT INTO USER_TABLE_STAGE (EMPLID, WORK_FOR_AGENCY_EMPLID, WORK_FOR_AGENCY, EMPL_STATUS, LAST_NAME, FIRST_NAME, MIDDLE_NAME, DEPTID, DEPT_DESCR, JOBCODE, JOBCODE_DESCR, B_SAFETY_SENSTV, HR_STATUS, POSITION_NBR, POSNUM_DESCR, HIRE_DT) " + "VALUES(:val1, :val2, :val3, :val4, :val5, :val6, :val7, :val8, :val9, :val10, :val11, :val12, :val13, :val14, :val15, :val16)", targetConnection))
2. 优化参数绑定逻辑
不要在循环内重复添加参数(会导致参数累积),先一次性定义所有参数,再在循环中赋值:
insertCommand.BindByName = true; // 先创建所有参数并添加到命令 insertCommand.Parameters.Add(new OracleParameter(":val1", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val2", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val3", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val4", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val5", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val6", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val7", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val8", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val9", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val10", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val11", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val12", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val13", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val14", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val15", OracleDbType.Varchar2)); insertCommand.Parameters.Add(new OracleParameter(":val16", OracleDbType.Date)); // 根据实际字段类型调整 while (reader.Read()) { // 循环内仅赋值 insertCommand.Parameters[":val1"].Value = reader["EMPLID"]; insertCommand.Parameters[":val2"].Value = reader["WORK_FOR_AGENCY_EMPLID"]; insertCommand.Parameters[":val3"].Value = reader["WORK_FOR_AGENCY"]; insertCommand.Parameters[":val4"].Value = reader["EMPL_STATUS"]; insertCommand.Parameters[":val5"].Value = reader["LAST_NAME"]; insertCommand.Parameters[":val6"].Value = reader["FIRST_NAME"]; insertCommand.Parameters[":val7"].Value = reader["MIDDLE_NAME"]; insertCommand.Parameters[":val8"].Value = reader["DEPTID"]; insertCommand.Parameters[":val9"].Value = reader["DEPT_DESCR"]; insertCommand.Parameters[":val10"].Value = reader["JOBCODE"]; insertCommand.Parameters[":val11"].Value = reader["JOBCODE_DESCR"]; insertCommand.Parameters[":val12"].Value = reader["B_SAFETY_SENSTV"]; insertCommand.Parameters[":val13"].Value = reader["HR_STATUS"]; insertCommand.Parameters[":val14"].Value = reader["POSITION_NBR"]; insertCommand.Parameters[":val15"].Value = reader["POSNUM_DESCR"]; insertCommand.Parameters[":val16"].Value = reader["hire_dt"]; insertCommand.ExecuteNonQuery(); Console.WriteLine("inserted record."); }
额外注意点
- 确保参数的
OracleDbType与目标表字段类型匹配(比如hire_dt对应OracleDbType.Date),避免隐式转换问题。 - 原代码中
targetConnection的定义和using块缺失,建议将其也包裹在using中,确保连接正确释放。
内容的提问来源于stack exchange,提问作者donovan rice
相关产品推荐
相关产品推荐

