如何使用C#从Visual Studio调用SELECT过程

本文关键字:调用 SELECT 过程 Studio Visual 何使用 | 更新日期: 2024-10-07 13:16:44

我是使用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.UracleClient.OracleException"的异常,但未在用户代码中进行处理

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

PLS-00306:调用"错误."时参数的数量或类型错误

你能帮我找出造成这个问题的原因吗?非常感谢。

如何使用C#从Visual Studio调用SELECT过程

我对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;