使用C#执行Oracle存储过程时出错
发布时间:2020-12-15 07:46:15 所属栏目:百科 来源:网络整理
导读:我正在尝试使用C#执行Oracle存储过程(1个输入和2个输出参数). 我的表包含3列;整数id和2个varchar2类型列. 这是表定义: CREATE TABLE TESTTABLE ( ID INT Not Null,FNAME VARCHAR2(200),LNAME VARCHAR2(200),Constraint PK Primary Key (ID)); 这是我的存储
我正在尝试使用C#执行Oracle存储过程(1个输入和2个输出参数).
我的表包含3列;整数id和2个varchar2类型列. 这是表定义: CREATE TABLE TESTTABLE ( ID INT Not Null,FNAME VARCHAR2(200),LNAME VARCHAR2(200),Constraint PK Primary Key (ID) ); 这是我的存储过程: create or replace PROCEDURE TESTP ( tempID IN TESTTABLE.ID%Type,tempName Out TESTTABLE.NAME%TYPE,tempLName out TESTTABLE.LNAME%TYPE ) AS BEGIN select Name,LNAME into tempName,tempLName from TestTable where ID = tempID; END; 以下是从C#执行此过程的代码: try { Int32 id = 1; string FName = "",LName = ""; using (_ora.GetOracleConnection()) { Oracle.DataAccess.Client.OracleCommand cmd = new Oracle.DataAccess.Client.OracleCommand("TESTP",_ora.GetOracleConnection()); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("tempId",Oracle.DataAccess.Client.OracleDbType.Int32,ParameterDirection.Input).Value = id; cmd.Parameters.Add("tempName",Oracle.DataAccess.Client.OracleDbType.Varchar2,200,ParameterDirection.Output).Value = FName; cmd.Parameters.Add("tempLName",ParameterDirection.Output).Value = LName; cmd.ExecuteNonQuery(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } 这是生成的异常:
谁能帮我 ? 解决方法
代码中的这些修改对我有用:
using (connection) { Int32 id = 1; OracleCommand cmd = new OracleCommand("TESTP",connection); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("tempID",OracleDbType.Int32,ParameterDirection.Input).Value = id; cmd.Parameters.Add("tempName",OracleDbType.Varchar2,200).Direction = ParameterDirection.Output; cmd.Parameters.Add("tempLName",200).Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); string FName = cmd.Parameters["tempName"].Value.ToString(); string LName = cmd.Parameters["tempLName"].Value.ToString(); } 您还可以在Oracle过程中添加异常块来处理no_data_found异常并避免ORA-01403错误,如下所示: CREATE OR REPLACE PROCEDURE TESTP (tempID IN TESTTABLE.ID%Type,tempName out TESTTABLE.NAME%TYPE,tempLName out TESTTABLE.LNAME%TYPE) AS BEGIN select Name,LNAME Into tempName,tempLName from TestTable Where ID = tempID; EXCEPTION WHEN NO_DATA_FOUND THEN tempName := null; tempLName := null; END; 并添加额外的OUT参数,通知成功或失败,并在C#代码中处理它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |