2015-06-30 19 views
7

Tôi đang cố gắng thực hiện thủ tục lưu sẵn Oracle (1 tham số đầu vào và 2 tham số) bằng C#.Lỗi khi thực hiện Quy trình lưu trữ Oracle bằng C#

Bảng của tôi chứa 3 cột; một cột số nguyên id và 2 varchar2.

Đây là định nghĩa bảng:

CREATE TABLE TESTTABLE 
(
    ID INT Not Null, 
    FNAME VARCHAR2(200), 
    LNAME VARCHAR2(200), 
    Constraint PK Primary Key (ID) 
); 

này được thủ tục lưu trữ của tôi:

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; 

Đây là đoạn mã để thực hiện thủ tục này từ 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", Oracle.DataAccess.Client.OracleDbType.Varchar2,200,ParameterDirection.Output).Value = LName; 

       cmd.ExecuteNonQuery(); 
      } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.ToString()); 
} 

Đây là ngoại lệ được tạo:

Oracle.DataAccess.Client.OracleException ORA-06.502: PL/SQL: số hoặc giá trị lỗi
ORA-06.512: tại "USMANDBA.TESTP", dòng 9

bất cứ ai có thể giúp tôi?

+0

Bạn có thể đăng mã của '_ora.GetOracleConnection()'? –

+0

chỉ là một phương thức để trả về đối tượng đang mở hoặc đang kết nối hiện tại. –

+0

đây là cách kết nối được thiết lập: con = new OracleConnection(); con.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings ["MyConnection"]. ConnectionString.ToString(); con.Open(); và đây là phương thức công khai của OracleConnection GetOracleConnection() { trả lại this.con; } –

Trả lời

2

Những thay đổi trong mã của bạn làm việc cho tôi:

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", OracleDbType.Varchar2, 200).Direction = ParameterDirection.Output; 
    cmd.ExecuteNonQuery(); 
    string FName = cmd.Parameters["tempName"].Value.ToString(); 
    string LName = cmd.Parameters["tempLName"].Value.ToString(); 
} 

Bạn cũng có thể thêm khối ngoại lệ trong quy trình Oracle để xử lý ngoại lệ no_data_found và tránh ORA-01403 lỗi, giống như ở đây:

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; 

và thêm tham số OUT bổ sung thông báo về sự thành công hay thất bại và xử lý nó trong mã C#.

+0

cảm ơn bạn rất nhiều .. nó đã hoạt động .. –

Các vấn đề liên quan