2017-02-17 43 views
1

正如你可以看到我試圖執行兩個oracle函數使用c# 第一個函數F_INS_ORDER_DATA返回值將被用作參數與第二個但當第二個函數執行F_INS_ORDER_DATA_DETAILS我越來越以下錯誤執行多個oracle函數返回錯誤

我測試蟾蜍兩個功能,他們精做

  1. 工作我錯過了什麼?
  2. 請,如果有任何改善我的代碼或更好的方法來做到這一點,我會爲任何建議

ORA-06550真的很感謝:第1行,第7列:

PLS- 00221: 'F_INS_ORDER_DATA_DETAILS' 不是過程或是 未定義

ORA-06550:第1行,第7列:

PL/SQL:語句忽略

  string connstr = @"Data Source=orcl; User Id=user; password=pwd;"; 
      string cmdtxt01 = @"F_INS_ORDER_DATA"; 
      string cmdtxt02 = @"F_INS_ORDER_DATA_DETAILS"; 
      int INVOICE_ID; 

      using (OracleConnection conn = new OracleConnection(connstr)) 
      using (OracleCommand cmd = new OracleCommand(cmdtxt01, conn)) 
      { 
       try 
       { 
        conn.Open(); 

        cmd.CommandText = cmdtxt01; 
        cmd.CommandType = CommandType.StoredProcedure; 

        cmd.Parameters.Clear(); 

        cmd.Parameters.Add(":vORDER_ID", OracleDbType.Int32, ParameterDirection.ReturnValue); 

        cmd.Parameters.Add(new OracleParameter(":P_CUSTOMER_ID", OracleDbType.Int64)).Value = TB_CUSTOMER_ID.Text; 
        cmd.Parameters.Add(new OracleParameter(":P_ORDER_NOTE", OracleDbType.Varchar2)).Value = TB_ORDER_NOTE.Text; 
        cmd.Parameters.Add(new OracleParameter(":P_CREATED_BY", OracleDbType.Varchar2)).Value = "SYSTEM"; 

        cmd.ExecuteNonQuery(); 

        TB_INVOICE_ID.Text = cmd.Parameters[":vORDER_ID"].Value.ToString(); 
        int.TryParse(TB_INVOICE_ID.Text, out INVOICE_ID); 

        cmd.CommandText = cmdtxt02; 
        cmd.CommandType = CommandType.StoredProcedure; 

        foreach (DataGridViewRow Row in DGV_INVOICE.Rows) 
        { 
         cmd.Parameters.Clear(); 

         cmd.Parameters.Add(new OracleParameter(":P_ORDER_ID", OracleDbType.Int32)).Value = INVOICE_ID; 
         cmd.Parameters.Add(new OracleParameter(":P_PRODUCT_ID", OracleDbType.Int64)).Value = Row.Cells[DGV_INVOICE.Columns["DGV_PRODUCT_ID"].Index].Value; 
         cmd.Parameters.Add(new OracleParameter(":P_UNIT_PRICE", OracleDbType.Int32)).Value = Row.Cells[DGV_INVOICE.Columns["DGV_UNIT_PRICE"].Index].Value; 
         cmd.Parameters.Add(new OracleParameter(":P_QUANTITY", OracleDbType.Int32)).Value = Row.Cells[DGV_INVOICE.Columns["DGV_QUANTITY"].Index].Value; 
         cmd.Parameters.Add(new OracleParameter(":P_DISCOUNT", OracleDbType.Int32)).Value = Row.Cells[DGV_INVOICE.Columns["DGV_DISCOUNT"].Index].Value; 
         cmd.Parameters.Add(new OracleParameter(":P_ORDER_STATUS", OracleDbType.Varchar2)).Value = '1'; 
         cmd.Parameters.Add(new OracleParameter(":P_ITEM_NOTE", OracleDbType.Varchar2)).Value = Row.Cells[DGV_INVOICE.Columns["DGV_ITEM_NOTE"].Index].Value; 
         cmd.Parameters.Add(new OracleParameter(":P_CREATED_BY", OracleDbType.Varchar2)).Value = "SYSTEM"; 

         cmd.ExecuteNonQuery(); 
        } 
       } 
       catch (Exception EX) 
       { 
        MessageBox.Show(EX.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        return; 
       } 
      } 
+0

DB抱怨'F_INS_ORDER_DATA_DETAILS'不存在,你有沒有檢查你的數據庫存在,沒有任何錯字? – Gusman

+0

@Gusman是的,我做了,並且在你的評論之後,我拷貝並粘貼了它 – sam

回答

2

Oracle過程和功能之間進行區分。

過程存儲的代碼不返回值。函數是存儲返回一個值的代碼。你使用它們的方式(在Oracle中)有些不同。

由於數據庫抱怨F_INS_ORDER_DATA_DETAILS不是一個程序,它可能是一個函數(返回值),但你不抓住它就像你在第一次調用做:

cmd.Parameters.Add(":vORDER_ID", OracleDbType.Int32, ParameterDirection.ReturnValue); 

因此,請確定您使用的是存儲過程:

create or replace procedure F_INS_ORDER_DATA_DETAILS ... 

或從函數捕獲返回值。

+1

你是對的人我從第一個函數捕獲返回值'F_INS_ORDER_DATA'並且不會從第二個函數'F_INS_ORDER_DATA_DETAILS'獲取返回值..非常感謝您擁有50個人口 – sam

0
using (OracleConnection conn = new OracleConnection(connstr)) 
using (OracleCommand cmd = new OracleCommand(cmdtxt01, conn)) 
{ 
    try 
    { 
     conn.Open(); 

     cmd.CommandText = cmdtxt01; 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.Add(":vORDER_ID", OracleDbType.Int32, ParameterDirection.ReturnValue); 

     cmd.Parameters.Add(new OracleParameter(":P_CUSTOMER_ID", OracleDbType.Int32)).Value = TB_CUSTOMER_ID.Text; 
     cmd.Parameters.Add(new OracleParameter(":P_ORDER_NOTE", OracleDbType.Varchar2)).Value = TB_ORDER_NOTE.Text; 
     cmd.Parameters.Add(new OracleParameter(":P_CREATED_BY", OracleDbType.Varchar2)).Value = "SYSTEM"; 
     //excute first SP 
     cmd.ExecuteNonQuery(); 
     //get the value 
     TB_INVOICE_ID.Text = cmd.Parameters[":vORDER_ID"].Value.ToString(); 
     int INVOICE_ID; 
     // parse return value 
     int.TryParse(TB_INVOICE_ID.Text, out INVOICE_ID); 

     // now set 2nd SP 
     cmd.CommandText = cmdtxt02; 
     cmd.CommandType = CommandType.StoredProcedure; 

     foreach (DataGridViewRow Row in DGV_INVOICE.Rows) 
     { 
      cmd.Parameters.Clear(); 
      cmd.Parameters.Add(new OracleParameter(":P_ORDER_ID", OracleDbType.Int32)).Value = INVOICE_ID; 
      cmd.Parameters.Add(new OracleParameter(":P_PRODUCT_ID", OracleDbType.Int32)).Value = Row.Cells[DGV_INVOICE.Columns["DGV_PRODUCT_ID"].Index].Value; 
      cmd.Parameters.Add(new OracleParameter(":P_UNIT_PRICE", OracleDbType.Int32)).Value = Row.Cells[DGV_INVOICE.Columns["DGV_UNIT_PRICE"].Index].Value; 
      cmd.Parameters.Add(new OracleParameter(":P_QUANTITY", OracleDbType.Int32)).Value = Row.Cells[DGV_INVOICE.Columns["DGV_QUANTITY"].Index].Value; 
      cmd.Parameters.Add(new OracleParameter(":P_DISCOUNT", OracleDbType.Int32)).Value = Row.Cells[DGV_INVOICE.Columns["DGV_DISCOUNT"].Index].Value; 
      cmd.Parameters.Add(new OracleParameter(":P_ORDER_STATUS", OracleDbType.Varchar2)).Value = '1'; 
      cmd.Parameters.Add(new OracleParameter(":P_ITEM_NOTE", OracleDbType.Varchar2)).Value = Row.Cells[DGV_INVOICE.Columns["DGV_ITEM_NOTE"].Index].Value; 
      cmd.Parameters.Add(new OracleParameter(":P_CREATED_BY", OracleDbType.Varchar2)).Value = "SYSTEM"; 

      cmd.ExecuteNonQuery(); 
     } 


    } 
    catch (Exception EX) 
    { 
     MessageBox.Show(EX.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     return; 
    } 
} 
+0

同樣的問題,但是現在在將'cmd.ExecuteNonQuery();'從最後一行移動到你建議第一個函數將插入記錄的位置之後,提交它甚至第二個功能不能插入記錄......這種方式我把它放在最後一行,所以如果第二個功能失敗的第一個功能將不會在數據庫中做任何事 – sam