我是使用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.OracleException'的异常发生在System.Data.OracleClient.dll中但未在用户代码中处理
其他信息:ORA-06550:第1行,第7栏:
PLS-00306:调用"错误的参数数量或类型错误。
请您帮助我找出导致此问题的原因?谢谢。
答案 0 :(得分:0)
我对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;