OracleDataReader пуст, но запрос в порядкеC#

Место общения программистов C#
Anonymous
OracleDataReader пуст, но запрос в порядке

Сообщение Anonymous »

Если в пакете Oracle PLSQL есть такой код (ввод невозможно скопировать/вставить с рабочего ноутбука, поэтому извините за опечатки):

Код: Выделить всё

CREATE OR REPLACE PACKAGE mypkg AS
FUNCTION f1 ( p1 IN NUMBER ) RETURN SYS_REFCURSOR;
FUNCTION f2 ( p1 IN NUMBER ) RETURN SYS_REFCURSOR;
END;
/

CREATE OR REPLACE PACKAGE BODY mypkg AS
FUNCTION f1 ( p1 IN NUMBER ) RETURN SYS_REFCURSOR IS
rc SYS_REFCURSOR;
BEGIN
OPEN rc FOR
SELECT *
FROM mytable
WHERE c1 = p1;
RETURN rc;
END;
FUNCTION f2 ( p1 IN NUMBER ) RETURN SYS_REFCURSOR IS
rc SYS_REFCURSOR;
BEGIN
OPEN rc FOR
SELECT c2, COUNT(1) num_rows
FROM mytable
WHERE c1 = p1
GROUP BY c2;
RETURN rc;
END;
END;
/

Код C#:

Код: Выделить всё

public DataTable getData ( string sname, string p1 )
{
DataTable dt = new DataTable();
string qry = "BEGIN :rc := mypkg." + sname + " ( TO_NUMBER( :p1 ) ); END;";

try
{
OracleConnection conn = getConn();  // returns connection
conn.open();
OracleCommand cmd =  new OracleCommand( qry, conn);
cmd.BindByName = true;
OracleParameter refcur = new OracleParamater("rc", OracleDbType.RefCursor);
refcur.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(refcur);
cmd.Parameters.Add(new OracleParameter("p1", OracleDbType.Varchar2)).Value = p1.ToString();

using ( OracleDataReader rd = cmd.ExecuteReader())
{
dt.Load(rd);
}

cmd.Dispose();
conn.Close();
return dt;
}
Когда я запускаю это следующим образом, это работает:

Код: Выделить всё

 DataTable dt = getData ( "f1", "5" );
Когда я запускаю это следующим образом, выдается пустая таблица данных:

Код: Выделить всё

 DataTable dt = getData ( "f2", "5" );
Когда я запускаю любой из них напрямую в SQLPLUS, я получаю результаты для обоих, поэтому проблема связана с OracleDataReader.
У меня есть несколько аналогичные функции и те, которые кажутся неработающими, — это те, которые повторно запускают столбец COUNT() или SUM(). Может ли это быть причиной, и если да, то как можно это исправить?

Подробнее здесь: https://stackoverflow.com/questions/790 ... ry-is-fine

Вернуться в «C#»