ASP.NET и Oracle Хранимая Процедура Ошибка - PullRequest
2 голосов
/ 18 ноября 2011

Я ОЧЕНЬ новичок в том, что касается хранимых процедур и .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();
}

Моя строка подключения верна, потому что я использую ее в другом месте моего кода, и она работает.Раздел с комментариями - это хранимая процедура, которую я пытаюсь использовать, очевидно.Пожалуйста, помогите мне!

Ответы [ 2 ]

0 голосов
/ 18 ноября 2011

Вы присваиваете новый экземпляр своей переменной 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);

Просто взглянув на ваш код, я думаю, что вы должны просто удалить эту строку, и все должно быть в порядке.

0 голосов
/ 18 ноября 2011

Просто глядя на ваш код и не знаком с этим объектом OracleCommand, похоже, что вы создаете параметры, а затем создаете новый объект в середине, стирая все ваши добавления параметров. Создайте новый объект из соединения, а затем добавьте свои параметры. Попытка нанести удар по лучшему коду ниже. Также я хотел бы использовать операторы для любых объектов подключения, связи и обеспечения их закрытия и удаления.

Редактировать: не смотрел слишком глубоко, моя вина. Похоже, что имена параметров не совпадают в хранимой процедуре и в коде .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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...