簡體   English   中英

如何使用C#從Visual Studio調用SELECT過程?

[英]How can I call a SELECT procedure from Visual Studio using C#?

我是使用C#語言開發Web應用程序的初學者,我遇到了運行ASP.NET代碼的問題。 我在TOAD FOR ORACLE中編寫了一個程序,並且它已成功創建。

CREATE OR REPLACE PROCEDURE GENERALAPPLICATION.LE_SELECT_EMPLOYEE 
(EMPID IN OUT INTEGER, F_NAME OUT VARCHAR, L_NAME OUT VARCHAR, 
 PHO OUT INTEGER, ADRS OUT VARCHAR)
IS
BEGIN
    SELECT 
       FNAME, LNAME, PHONE, ADDRESS 
    INTO 
       F_NAME, L_NAME, PHO, ADRS 
    FROM 
       LE_EMPLOYEE
    WHERE 
       EID = EMPID;
   COMMIT;

   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END LE_SELECT_EMPLOYEE;
/

現在我想在使用C#的Web應用程序表單中使用它,所以我在按鈕單擊處理程序方法中編寫了這段代碼:

protected void Button4_Click(object sender, EventArgs e)
{
    int EID = int.Parse(EIDBox.Text);

    string oradb = "Data Source=*****;User ID=*****;Password=*****;Unicode=True";

    OracleConnection conn = new OracleConnection(oradb);
    conn.Open();

    OracleCommand cmd = new OracleCommand("LE_SELECT_EMPLOYEE", conn);
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add("EMPID", OracleType.VarChar, 20, ParameterDirection.InputOutput.ToString()).Value = EID;
    cmd.Parameters.Add("F_NAME", OracleType.VarChar, 20, ParameterDirection.Output.ToString());
    cmd.Parameters.Add("L_NAME", OracleType.VarChar, 20, ParameterDirection.Output.ToString());
    cmd.Parameters.Add("PHO", OracleType.VarChar, 20, ParameterDirection.Output.ToString());
    cmd.Parameters.Add("ADRS", OracleType.VarChar, 20, ParameterDirection.Output.ToString());

    OracleDataReader dr = cmd.ExecuteReader();

    dr.Read();

    DataTable DT = new DataTable();
    DT.Load(dr);

    GridView1.DataSource = DT;
    GridView1.DataBind();
}

但是我收到了錯誤

OracleDataReader dr = cmd.ExecuteReader();

說調用中的參數類型有錯誤。

System.Data.OracleClient.dll中出現“System.Data.OracleClient.OracleException”類型的異常,但未在用戶代碼中處理

附加信息:ORA-06550:第1行第7列:

PLS-00306:調用“錯誤”時參數的數量或類型錯誤。

你能幫我找一下造成這個問題的原因嗎? 謝謝。

我使用Oracle和C#的經驗是必須使用游標返回所有數據。 無論是返回一個值還是已滿表,都必須使用SYS_REFCURSOR。

這是您重寫的代碼

CREATE OR REPLACE PROCEDURE GENERALAPPLICATION.LE_SELECT_EMPLOYEE 
(EMPID_IN IN NUMBER v_cursor OUT SYS_REFCURSOR)
IS
v_selectquery   VARCHAR2 (4000);
BEGIN
   v_selectquery = 'SELECT FNAME, LNAME, PHONE, ADDRESS '
    ||'FROM LE_EMPLOYEE WHERE EID ='|| EMPID_IN;

   OPEN v_cursor FOR v_selectquery;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
          THEN
             v_selectquery := 'Select null from dual';

             OPEN v_cursor FOR v_selectquery;
END LE_SELECT_EMPLOYEE;

暫無
暫無

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

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