簡體   English   中英

將oracle的sys_refcursor返回給c#

[英]Return sys_refcursor of the oracle to c#

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;

從 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

是否有理由不使用函數而不是過程?

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);

當你運行da.Fill(ds); 然后執行函數,即使用cmd.ExecuteNonQuery(); 函數執行兩次。

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

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

最后,我設法讓它以這種方式工作:

存儲過程

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;

源代碼

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;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM