2016-07-30 32 views
0

我我的C#程序如何傳遞到Oracle的功能從C#參數

CREATE OR REPLACE FUNCTION F_INSERT_ORDER_DATA ( P_CUSTOMER_ID  IN NUMBER, 
                P_NOTES     IN VARCHAR2, 
                P_CREATED_BY   IN VARCHAR2) 
    RETURN NUMBER 
IS 
    vCREATED_ON DATE := SYSDATE; 
    vORDER_ID  NUMBER; 
BEGIN 
    INSERT INTO orders (ORDER_ID, 
             CUSTOMER_ID, 
             NOTES, 
             CREATED_BY, 
             CREATED_ON) 
         VALUES (NULL,        --ORDER_ID Filled by trigger 
             P_CUSTOMER_ID,   --CUSTOMER_ID 
             P_NOTES,     --NOTES 
             P_CREATED_BY,    --CREATED_BY 
             vCREATED_ON)    --CREATED_ON 
RETURNING ORDER_ID INTO vORDER_ID; 

    RETURN (vORDER_ID); 

END; 

,但我得到的是我不能插入空到CUSTOMER_ID列誤差範圍內執行以下功能,使 錯誤是由傳遞參數c#到oracle函數 我需要有人來幫助我通過傳遞參數?

private void B_Insert_Click(object sender, EventArgs e) 
    { 
     if (PaidCash < TotalInv) 
     { 
      MessageBox.Show("paid amount less than cost", "be careful", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
      TB_PAID_CASH.BackColor = Color.Tomato; 
      TB_PAID_CASH.Focus(); 
      return; 
     } 
     else if (Reminder < 0) 
     { 
      MessageBox.Show("zero value", "be careful", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
      TB_Discount.BackColor = Color.Tomato; 
      TB_Discount.Focus(); 
      return; 
     } 
     else 
     { 
      Form_control("DataInserted"); 

      string connstr = @"Data Source=orcl; User Id=admin; password=123123;"; 

      string insertcmdtxt = @"F_INSERT_ORDER_DATA"; //~ F_INSERT_ORDER_DATA ~// 

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

        cmd.CommandType = CommandType.StoredProcedure; 

        cmd.CommandText = insertcmdtxt; 

        cmd.Parameters.Add(new OracleParameter("P_CUSTOMER_ID",TB_CUSTOMER_ID.Text)); 
        cmd.Parameters.Add(new OracleParameter("P_NOTES", null)); 
        cmd.Parameters.Add(new OracleParameter("P_CREATED_BY", "System")); 
        cmd.Parameters.Add(":vORDER_ID", OracleDbType.Int64, ParameterDirection.ReturnValue); 

        cmd.ExecuteNonQuery(); 

        TB_INVOICE_ID.Text = (cmd.Parameters[":vORDER_ID"].Value).ToString(); 

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

回答

1

使用此語法來傳遞參數值

int customerID = Convert.ToInt32(TB_CUSTOMER_ID.Text); 
cmd.Parameters.Add("P_CUSTOMER_ID",OracleDbType.Int32).Value = customerID; 

考慮的是,你應該通過參數指定由底層柱期望的類型。如果CustomerID是一個整數,那麼不要傳遞一個字符串,而是適當地將該值轉換爲一個整數並使用正確的OracleDbType枚舉。如果你不採取這種習慣,你會發現自己遇到麻煩時,無論出於何種原因數據庫引擎使用不同的方法來轉換值(特別是問題的浮點值和日期)

+0

數據庫中customerID列的數據類型是數字但他們是不是與OracleDbType的數字數據類型,所以使用int64會遇到問題? – samer

+0

根據[MSDN上的此頁面](https://msdn.microsoft.com/en-us/library/yk72thhd(v = vs.110).aspx),您有一個十進制值。怪異的ID – Steve

+0

雖然這是DataType映射上的Oracle文檔https://docs.oracle.com/cd/E56485_01/win.121/e55744/entityDataTypeMapping.htm#ODPNT8300 – Steve