簡體   English   中英

ASP.NET和Oracle存儲過程錯誤

[英]ASP.NET and Oracle Stored Procedure Error

對於存儲過程和.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();
}

我的連接字符串是正確的,因為我在代碼中的其他地方使用了它並且可以正常工作。 評論的部分是我顯然要使用的存儲過程。 請幫我!

僅查看代碼而不熟悉此OracleCommand對象,就好像您正在創建參數,然后在中間創建一個新對象,以清除所有參數添加項。 從連接中創建一個新對象,然后添加您的參數。 嘗試嘗試以下更好的代碼。 我還將對任何連接對象,commnand對象使用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);

僅查看代碼即可,我認為您應該刪除該行,就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM