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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:14:53