[英]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.