列表中的多个命名参数实例

时间:2009-04-14 09:52:49

标签: asp.net-2.0

我在ASP.NET应用程序中遇到此错误(而在Oracle中可以正常工作)

PLS-00703 ::列表中的多个命名参数实例

我在这里附上了代码。它在最后一行显示错误,即 cmd.ExecuteNonQuery()

    cmd.Parameters.AddWithValue("in_prog_id", 2);
    cmd.Parameters.AddWithValue("in_sllr_co_id", 1);
    cmd.Parameters.AddWithValue("in_sllr_purch_loc_nbr", 1);
    cmd.Parameters.AddWithValue("in_byr_co_id", Convert.ToInt32(co_id));
    cmd.Parameters.AddWithValue("in_byr_purch_loc_nbr", purch_loc_nbr);
    cmd.Parameters.AddWithValue("in_ing_id", ing_id);
    cmd.Parameters.AddWithValue("in_per_id", per_id);
    cmd.Parameters.AddWithValue("in_ing_purch_qty", "12");
    cmd.Parameters.AddWithValue("in_pop_sl_trck_nbr", "ECAP");
    cmd.Parameters.AddWithValue("in_pop_sl_cmnt_txt",  dstemp.Tables["ECAP"].Rows[i][6].ToString());
    cmd.Parameters.AddWithValue("in_chg_by", 1333);
    cmd.Parameters.AddWithValue("in_ing_rev_amt", dstemp.Tables["ECAP"].Rows[i][5].ToString());
    cmd.Parameters.AddWithValue("in_sl_typ", "ME");
    cmd.Parameters.AddWithValue("in_dir_sale_ind", "DIR-SL");
    cmd.Parameters.AddWithValue("in_intg_sl_ind", "N");  ***//character as input***
    cmd.ExecuteNonQuery();

这是我的方法,其中包含上述陈述。

private void call_proc(int i, DataSet dstemp, OracleCommand cmd)
{


}

我按如下方式调用此方法:

    cmd1 = conn3.CreateCommand();
    cmd1.CommandText = "pkg_sale.cre_pop_sl";
    cmd1.CommandType = CommandType.StoredProcedure;
    for (int i = 0; i < ds.Tables["ECAP"].Rows.Count; ++i)
        call_proc(i, ds, cmd1);

这有什么问题吗?

3 个答案:

答案 0 :(得分:1)

您是否正在重用cmd中的实例来处理多个SQL语句?

你在这里发布的内容没有重复,所以我怀疑这个代码是否导致问题。

答案 1 :(得分:1)

这似乎是Oracle存储过程的常见错误,最常见的原因是开发人员在重复调用代码之前忽略了调用Parameters.Clear

或者,或者你的一个或多个参数在其他地方重复。

编辑(OP发布后)

这似乎是第一种可能性,因为您在循环中调用该函数。只需清除循环函数中的参数即可。

请参阅this reference

答案 2 :(得分:0)

我遇到了另一种情况,如果您使用ODP.Net,可能会发生这种情况。如果您使用任何实用程序类来生成命令(就像我在我的项目中那样),它可能会做一些“聪明”的操作。在场景后面工作以从存储过程中导出参数。

 OracleCommandBuilder.DeriveParameters((OracleCommand)command);

此语句将参数注入Command对象,如果将参数添加到同一cmd对象(就像通常那样),它将有2个具有相同名称的参数。