DbManager.SetSpCommand с пустым parameterValues
От: Sashko Россия http://www.dc.baika.ru/
Дата: 25.01.06 10:40
Оценка: 40 (1)
Сразу оговорюсь, что работаю с Oracle'овским Data Provider'ом (10.1.0.4). Может с DP от MS таких проблем и не возникает.

Определяю абстакного reader'а (GetEntities)

    public abstract class EntityAccessor : DataAccessor<Entity>
    {
        [SprocName("topology.get_entities")]
        public abstract List<Entity> GetEntities();
    }

или просто делаю вызов

    List<Entity> entities = db.SetSpCommand("topology.get_entities").ExecuteList<Entity>();


где get_entities определена либо как функция без параметров возвращающая REF CURSOR

    function get_entities return refcursor;

либо как процедура с OUT параметром типа REF CURSOR.

    procedure get_entities(p_entities out refcursor);

ExecuteReader у ODP будет фалить, так как ему необходимо что б в команде было указано, либо Return параметер типа RefCursor (в первом случае), либо Output параметр RefCursor (во втором). В текущей реализации BLT, в случае если parameterValue метода DbManager.SetSpCommand путой, CreateSpParameters не вызывается и команда выполняется с пустым списком параметров.

Форсировал вызов CreateSpParameters (с небольшими изменениями в ней), ExecuteReader'ы стали выполняться.
Re: DbManager.SetSpCommand с пустым parameterValues
От: IT Россия linq2db.com
Дата: 26.01.06 01:55
Оценка:
Здравствуйте, Sashko, Вы писали:

S>Форсировал вызов CreateSpParameters (с небольшими изменениями в ней), ExecuteReader'ы стали выполняться.


Давай глянем на небольшие изменения
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: DbManager.SetSpCommand с пустым parameterValues
От: Sashko Россия http://www.dc.baika.ru/
Дата: 26.01.06 02:31
Оценка: 18 (1)
Здравствуйте, IT, Вы писали:

S>>Форсировал вызов CreateSpParameters (с небольшими изменениями в ней), ExecuteReader'ы стали выполняться.

IT>Давай глянем на небольшие изменения

Да там изменений, проверка parameterValues на

parameterValues != null && parameterValues.Length > 0

так как

private IDbDataParameter[] CreateSpParameters(string spName, object[] parameterValues)

счтитала что ей передаётся обязательно не пустой parameterValues.

Вопрос, а с System.Data.SqlClient.SqlCommand всё и так работает? Или там возврат курсора из хранимой процедуры как-то по другому делаeтся. Просто не знаком с MS SQL.
Re[3]: DbManager.SetSpCommand с пустым parameterValues
От: IT Россия linq2db.com
Дата: 26.01.06 02:47
Оценка:
Здравствуйте, Sashko, Вы писали:

S>Вопрос, а с System.Data.SqlClient.SqlCommand всё и так работает? Или там возврат курсора из хранимой процедуры как-то по другому делаeтся. Просто не знаком с MS SQL.


Вроде работает. Впрочем, MS SQL не возвращает курсоров.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: DbManager.SetSpCommand с пустым parameterValues
От: Sashko Россия http://www.dc.baika.ru/
Дата: 26.01.06 03:06
Оценка:
IT>Вроде работает. Впрочем, MS SQL не возвращает курсоров.

Ага, у него вроде и типа да же такого нет, для параметров. А вот MS'ный DP для Oracle (System.Data.OracleClient) ведёт себя так же как и ODP.NET (Oracle.DataAccess.Client). Если пытаться вызать SP без параметров и она определена как

type refcursor is ref cursor;
function get_entities return refcursor;

происходит ошибка

ORA-06550: Строка 1, столбец 7:
PLS-00221: 'GET_ENTITIES' не является процедурой или не определена
ORA-06550: Строка 1, столбец 7:
PL/SQL: Statement ignored

если определена как

type refcursor is ref cursor;
procedure get_entities(p_entities out refcursor);

ошибка

ORA-06550: Строка 1, столбец 7:
PLS-00306: ошибочно число или типы аргументов при обращении к 'GET_ENTITIES'
ORA-06550: Строка 1, столбец 7:
PL/SQL: Statement ignored
Re[5]: DbManager.SetSpCommand с пустым parameterValues
От: IT Россия linq2db.com
Дата: 26.01.06 03:34
Оценка:
Здравствуйте, Sashko, Вы писали:

IT>>Вроде работает. Впрочем, MS SQL не возвращает курсоров.


S>Ага, у него вроде и типа да же такого нет, для параметров. А вот MS'ный DP для Oracle (System.Data.OracleClient) ведёт себя так же как и ODP.NET (Oracle.DataAccess.Client). Если пытаться вызать SP без параметров и она определена как


Проверил для MS SQL, обновил версию на сайте. Проверь плиз для Оракла.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: DbManager.SetSpCommand с пустым parameterValues
От: Sashko Россия http://www.dc.baika.ru/
Дата: 27.01.06 02:25
Оценка:
IT>Проверил для MS SQL, обновил версию на сайте. Проверь плиз для Оракла.

Да, всё работает, и с MS'овским и с ODP.NET.
Re[7]: DbManager.SetSpCommand с пустым parameterValues
От: IT Россия linq2db.com
Дата: 27.01.06 02:32
Оценка:
Здравствуйте, Sashko, Вы писали:

IT>>Проверил для MS SQL, обновил версию на сайте. Проверь плиз для Оракла.


S>Да, всё работает, и с MS'овским и с ODP.NET.


Куль. А как ты ODP.NET подключал?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: DbManager.SetSpCommand с пустым parameterValues
От: Sashko Россия http://www.dc.baika.ru/
Дата: 27.01.06 02:39
Оценка:
S>>Да, всё работает, и с MS'овским и с ODP.NET.
IT>Куль. А как ты ODP.NET подключал?

Написал OracleOraDataProvider для ODP.NET

using Oracle.DataAccess.Client;
// ...

    public class OracleDataProvider : BLToolkit.Data.DataProvider.IDataProvider
    {
        // Копия BLToolkit.Data.DataProvider.OracleDataProvider
        // так как у ODP.NET имена основных типов совпадают с MS'ыми, только
        // живут в разных namespace'ач
        
        public virtual string Name
        {
            get { return "ODP"; }
        }
    }

ну а потом в коде

        DbManager.AddDataProvider(new OracleOraDataProvider());
        DbManager.AddConnectionString("ODP", "Data Source=SOPSTK;User ID=hugedata;Password=******");

в общем-то и всё
Re[9]: DbManager.SetSpCommand с пустым parameterValues
От: Sashko Россия http://www.dc.baika.ru/
Дата: 27.01.06 02:41
Оценка:
Так везде OracleDataProvider конечно, просто вначале его OraDataProvider назвал что не путать с BLToolkit'ным, а потом в отдельный namespace перетащил и хотел обозвать так же OracleDataProvider, но опечатался
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.