2016-07-30 11 views
0

I unten Funktionwie Parameter von C# oracle Funktion zu übergeben

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; 

aber ich bin immer Fehler in meinem C# Programm bin ausführen, die ich null in CUSTOMER_ID Spalt einfügen kann nicht so die Fehler durch Übergabe von Parametern sind von C# zu Orakel-Funktion Ich brauche jemanden, der mir hilft, Parameter zu übergeben?

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; 
       } 
      } 
     } 
    } 

Antwort

1

Verwenden Sie diese Syntax Parameter übergeben Werte

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

die Tatsache, dass Sie durch die zugrundeliegende Spalte erwarteten Parameter Angabe der Art passieren sollte. Wenn die CustomerID eine Ganzzahl ist, übergeben Sie keine Zeichenfolge, sondern konvertieren Sie den Wert in eine Ganzzahl und verwenden Sie die korrekte OracleDbType-Enumeration. Wenn Sie diese Gewohnheit nicht annehmen, werden Sie sich in Schwierigkeiten befinden, wenn die Datenbank-Engine aus irgendeinem Grund eine andere Methode zum Konvertieren von Werten verwendet (besonders problematisch sind Gleitkommawerte und -daten)

+0

Der Datentyp der customerID-Spalte in der Datenbank ist die Nummer aber ihr ist kein Zahl-Datentyp mit OracleDbType also tut das Verwenden von int64 Problem? – samer

+0

Laut [dieser Seite auf MSDN] (https://msdn.microsoft.com/en-us/library/yk72thhd (v = vs.110) .aspx) haben Sie einen Dezimalwert. Seltsam für eine ID – Steve

+0

Dies ist die Oracle-Dokumente auf DataType-Zuordnungen https://docs.oracle.com/cd/E56485_01/win.121/e55744/entityDataTypeMapping.htm#ODPNT8300 – Steve