ASP.. NET和Oracle存储过程错误

本文关键字:存储过程 错误 Oracle NET ASP | 更新日期: 2023-09-27 18:15:12

在存储过程和。net方面我是新手,所以我提前道歉。我有一个存储过程,我试图使用,我一直得到这个错误…"调用'COPY_ACCOUNT'时参数的数量或类型错误"。我不知道为什么。下面是我的存储过程代码,后面跟着我的c#。NET代码。任何帮助都非常感激。请。

create or replace procedure abstract_names.copy_account(r_rows_copied out int,
                                                    ar_old_acct in  abn_headings.acct_no%type,
                                                    ar_new_acct in  abn_headings.acct_no%type)
is  
cnt int := 0;
begin
    r_rows_copied := 0;
 for r in (select heading from abn_headings where acct_no = ar_old_acct) loop      
  copy_heading(cnt, ar_old_acct, r.heading, ar_new_acct);
  r_rows_copied := r_rows_copied + cnt; 
end loop;
dbms_output.put_line('called abstract_names.copy_account '||to_char(r_rows_copied));   
return; end;

然后是c#。NET代码…

using System.Data.OracleClient;
try
{
    conn.Open();
    OracleCommand cmd = new OracleCommand();
    cmd.Parameters.Add("r_rows_copied", OracleType.Int32).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("ar_from_acct", OracleType.VarChar).Value = accountNumberDropDownList.SelectedValue.ToString();
    cmd.Parameters.Add("ar_to_acct", OracleType.VarChar).Value = copyAccountDDL.SelectedValue.ToString();
    cmd = new OracleCommand("abstract_names.copy_account", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.ExecuteNonQuery();
    conn.Close();
    /*
    abstract_names.copy_account(r_rows_copied out int,
                        ar_from_acct in  abn_headings.acct_no%type,
                        ar_to_acct in  abn_headings.acct_no%type)
    */
}
finally
{
    if (conn != null)
        conn.Close();
}

我的连接字符串是正确的,因为我使用它在我的代码和它的工作。注释部分显然是我试图使用的存储过程。请帮帮我!

ASP.. NET和Oracle存储过程错误

只是看看你的代码,不熟悉这个oracleccommand对象,它看起来像你正在创建参数,然后在中间创建一个新对象,消除所有的参数添加。从连接创建一个新对象,然后添加参数。下面尝试编写更好的代码。此外,我还会对任何连接、命令对象使用using语句,以确保它们被关闭和处置。

编辑:没看得太深,我的错。看起来存储过程和。net代码中的参数名不匹配。另外,因为你返回一个值,我会使用ExecuteScalar方法,ExeuteNonQuery不会返回任何数据。
cmd = new OracleCommand("abstract_names.copy_account", conn);                      
cmd.Parameters.Add("r_rows_copied", OracleType.Int32).Direction = ParameterDirection.Output;
cmd.Parameters.Add("ar_old_acct ", OracleType.VarChar).Value = accountNumberDropDownList.SelectedValue.ToString();
cmd.Parameters.Add("ar_new_acct", OracleType.VarChar).Value = copyAccountDDL.SelectedValue.ToString();
cmd.CommandType = CommandType.StoredProcedure;
object value = cmd.ExecuteScalar();
conn.Close();

您为cmd变量分配了一个新实例,然后您失去了对您所做的操作的引用。

:

cmd.Parameters.Add("ar_to_acct", OracleType.VarChar).Value = copyAccountDDL.SelectedValue.ToString();
cmd = new OracleCommand("abstract_names.copy_account", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
conn.Close();

这是错误的行:

cmd = new OracleCommand("abstract_names.copy_account", conn);

只要看看你的代码,我认为你应该简单地删除那一行,它应该是好的