2015-10-05 26 views
0

C#:的oracle返回SYS_REFCURSOR到c#

public DataSet ListaClientes() 
    { 
     DataSet ds = new DataSet(); 
     try 
     { 
      System.Data.OracleClient.OracleConnection conexion = Conexion.GetConnection(); 
      if (conexion.State == System.Data.ConnectionState.Open) 
      { 
       System.Data.OracleClient.OracleCommand cmd = new System.Data.OracleClient.OracleCommand(); 
       cmd.Connection = conexion; 
       cmd.CommandText = "ListadoClientes"; 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.Parameters.Add("resul", OracleDbType.RefCursor).Direction = ParameterDirection.Output; 
       cmd.ExecuteNonQuery(); 
       conexion.Close(); 
       System.Data.OracleClient.OracleDataAdapter da = new System.Data.OracleClient.OracleDataAdapter(cmd);      
       da.Fill(ds);      
      } 
      return ds; 
     } 
     catch(Exception e) 
     { 
      throw e; 
     } 
    } 

Oracle存儲過程:

CREATE OR REPLACE PROCEDURE ListadoClientes(resul OUT sys_refcursor) 
IS 
BEGIN 
    OPEN resul for select ID ,NOMBRES ,APELLIDOS ,CEDULA ,DIRECCION ,TELEFONO 
    from cliente; 
END ListadoClientes; 

ERROR從C#CATCH塊可見:

ORA-06550: line 1, column 7: 
PLS-00306: wrong number or types of arguments in call to 'LISTADOCLIENTES' 
ORA-06550: line 1, column 7: PL/SQL: Statement ignored 

回答

0

是否有一個原因,你不使用一個功能,而不是程序?

CREATE OR REPLACE FUNCTION ListadoClientes() RETURN sys_refcursor 
IS 
resul Sys_refcursor; 
BEGIN 
    OPEN resul for select ID ,NOMBRES ,APELLIDOS ,CEDULA ,DIRECCION ,TELEFONO 
    from cliente; 
    RETURN resul; 
END ListadoClientes; 

然後在C#中,你必須把它改成這樣:

cmd.Parameters.Add("resul", OracleDbType.RefCursor, ParameterDirection.ReturnValue); 

無論如何,對於程序的正確方法應該是這樣:

cmd.CommandText = "ListadoClientes(:resul)"; 
0

最後,我設法讓它的工作方式如下:

存儲過程

create or replace PROCEDURE ListadoClientes(resul OUT sys_refcursor) IS BEGIN OPEN resul for select ID ,NOMBRES ,APELLIDOS ,CEDULA ,DIRECCION ,TELEFONO from cliente; END ListadoClientes; 

源C#

reference using Oracle.DataAccess.Client; 
public DataSet ListaClientes() 
    { 
     DataSet ds = new DataSet(); 
     try 
     { 
      OracleConnection conexion = Conexion.GetConnection2(); 
      if (conexion.State == System.Data.ConnectionState.Open) 
      { 
       OracleCommand cmd = new OracleCommand(); 
       cmd.Connection = conexion; 
       cmd.CommandText = "ListadoClientes"; 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.Parameters.Add("resul", OracleDbType.RefCursor).Direction = ParameterDirection.Output;      
       cmd.ExecuteNonQuery(); 
       conexion.Close(); 
       OracleDataAdapter da = new OracleDataAdapter(cmd);      
       da.Fill(ds); 
      } 
      return ds; 
     } 
     catch(Exception e) 
     { 
      throw e; 
     } 
    }