Запрос к базе Oracle...

  1. 9 г. назад

    Hi, All.

    Направьте куда копать, плиз.
    Ситуация такая: делаю запрос к базе Oracle но возникает ошибка:
    Ошибка при получении значения атрибута контекста (EOF)
    Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.

    Если-же сделать этот-же запрос в SQLTools то все нормально отрабатывает.

    ЗЫ
    У меня много рабочих запросов, а именно этот вот так себя ведет.

    Ответы: (2) (5) (12)
  2. Наверное, перед запросом надо ADODB.Recordset.Open сделать (навскидку, возможно комманда не так выглядит). В Делфях так было, когда через АДО работал. Открыть набор надо.

    Ответы: (3)
  3. (0) ну EOF это уже не запрос, это обработка результатов запроса

    Ответы: (4)
  4. (1) да там какая-то мутная функция. Сча вроде обещали дать без функции запрос.

  5. (2) ну да. EOF и BOF Ложь после выполнения запроса.

  6. Fedot Операция не допускается, если объект закрыт.

    Вот ключевой момент, Recordset закрывается раньше времени.

    Ответы: (7)
  7. Как вариант - обращение к набору после его закрытия

  8. (5) ага, в SQLTools запрос отрабатывает где-то пару тире тройку минут. А 1С выкидывает ошибку мгновенно.

  9. СтрокаПодключения = "Provider=OraOLEDB.Oracle;Password=8;User ID=8;Data Source=world;Persist Security Info=False;";
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.ConnectionString = СтрокаПодключения;
    Connection.ConnectionTimeout = 15;
    Connection.CursorLocation= 1;
    Попытка
    Connection.Open();
    Исключение
    СтрокаСообщения="Не удалось подключиться к базе Оракл";
    СтрокаСообщения=СтрокаСообщения+", ошибка: "+ОписаниеОшибки();
    Сообщить(СтрокаСообщения);
    Возврат Ложь;
    КонецПопытки;

    Command = Новый COMОбъект("ADODB.Command");
    Command.ActiveConnection = Connection;
    Command.CommandText = ТекстЗапроса;
    RecordSet = Новый COMОбъект("ADODB.RecordSet");
    RecordSet = Command.Execute(); //Выполнение и получение набора данных

    Ответы: (11) (14)
  10. Потом просто обходишь

  11. RecordSet = Command.Execute().Выгрузить(); - а так можно? :)

  12. (8) сча попробую.

  13. (0) тут оракл ни при чем, у тебя рекордсет закрылся

  14. Где-то у него Connection = неопределено скрывается раньше времени, как вариант :)
    Не закрывай соединение, пока не обработаешь набор.

  15. (8) та-же ошибка, объект закрыт

  16. fields.Count = 0 вот что получается после Command.Execute()

  17. Значит корячь запрос, может, параметры какие не передал

  18. Или, как вариант, формат параметров "не подходит" Оракулу.

  19. Запрос большой? В студию?

  20. Попробуй самый простой запрос типа select count(*) from tableX чего вернет.

    Ответы: (20)
  21. (19) простые все работают.

  22. вот запрос:

    WITH GOODS AS (SELECT TT.N_USER_ID,
    TT.VC_CODE,
    TT.N_GOOD_ID,
    TT.N_PRICE_DOC_ID,
    TT.VC_PRICE_DOC

    FROM SI_V_USER_GOODS UG,
    TABLE(SI_USERS_PKG_S.USER_AVAILABLE_SERVS_LIST(
    num_N_CONTRACT_ID => UG.N_DOC_ID,
    num_N_ACCOUNT_ID => UG.N_ACCOUNT_ID,
    num_N_OBJECT_ID => UG.N_OBJECT_ID,
    dt_D_OPER => SYSDATE)) TT

    WHERE UG.C_FL_CLOSED = 'N'
    AND UG.N_SUBJ_GOOD_TYPE_ID != SYS_CONTEXT('CONST', 'GOOD_SUBJ_Enable')
    ),

    PRICE AS (SELECT DISTINCT G.N_GOOD_ID,
    G.N_USER_ID,
    G.VC_CODE,
    G.VC_PRICE_DOC,
    DC.N_PRICE,
    INDC.N_SPEED_VOLUME IN_SPEED,
    INDC.N_SPEED_UNIT_ID IN_VALUE_SPEED,
    OUTDC.N_SPEED_VOLUME OUT_SPEED,
    OUTDC.N_SPEED_UNIT_ID OUT_VALUE_SPEED
    FROM GOODS G,
    SD_V_PRICE_ORDERS_C DC,
    SD_V_PRICE_ORDERS_C INDC,
    SD_V_PRICE_ORDERS_C OUTDC
    WHERE G.N_PRICE_DOC_ID = DC.N_DOC_ID
    AND G.N_GOOD_ID = DC.N_GOOD_ID
    AND DC.N_PRICE_ORDER_LINE_ID = INDC.N_PAR_LINE_ID (+)
    AND DC.N_PRICE_ORDER_LINE_ID = OUTDC.N_PAR_LINE_ID (+)
    AND INDC.N_GOOD_ID (+) = 40213701
    AND OUTDC.N_GOOD_ID (+) = 40213501)

    SELECT SI_SUBJECTS_PKG_S.GET_VC_CODE(N_USER_ID) VC_SUBJ,
    VC_CODE,
    VC_PRICE_DOC,
    N_PRICE,
    IN_SPEED,
    CASE IN_VALUE_SPEED
    WHEN 2050 THEN 'Мбит/с'
    WHEN 1050 THEN 'Кбит/с'
    WHEN 3050 THEN 'бит/с'
    END IN_VALUE_SPEED,
    OUT_SPEED,
    CASE OUT_VALUE_SPEED
    WHEN 2050 THEN 'Мбит/с'
    WHEN 1050 THEN 'Кбит/с'
    WHEN 3050 THEN 'бит/с'
    END OUT_VALUE_SPEED
    FROM PRICE;

    Ответы: (22)
  23. + (21) Кто делал запрос на вопрос "А можно его разбить на несколько запросов?" ответил так:
    "к сожалению данный запрос разбить на несколько не выйдет, потому что в данном запросе осуществляется выборка всех доступных услуг для каждого абонента (с помощью функции) и на основании этих данных (выбранных услуг) подбирается скорость и цена по данным услугам. Соответственно не будет первой части запроса не будет на основании чего выбирать скорость и цену для услуг."

  24. По-ходу, это не запрос, а процедура. Я вообще в Оракл запросах не силен, но что-то подсказывает...
    WITH GOODS AS
    Даже в голимом Акцессе эти понятия (на самом деле) различались.
    У меня больше мыслей нет.

    Ответы: (24)
  25. (23) ну да, чел и пишет, что некая функция.
    Простые "Селекты" отрабатывают спокойно.

    Ответы: (25)
  26. (24) я к тому, что в АДО возможно надо не ADODB.Command, а процедуру инициализировать. Давно это было, лет 10 назад. Позабыл я АДО уже...

  27. Попробуй пропустить эту строку:
    //RecordSet = Новый COMОбъект("ADODB.RecordSet");

    Ответы: (27)
  28. (26) так изначально я без нее и делал.

    Кстати, запросы отрабатывают одинаково есть она или нет

    Ответы: (28)
  29. + (27) ага, она бессмысленна :-)

  30. А в СКУЛЬТулзе этот запрос нормально отрабатывает?

    Ответы: (30)
  31. (29) Ага, с легкостью не превзойденной.

    Ответы: (31)
  32. +(30) в районе 3-х минут делается

  33. Попробуй так:
    RecordSet = Command.Execute(ТекстЗапроса);

    Ответы: (33)
  34. (32) все то-же...
    и ИМХО монопенисуально как писать в скобках али нет.

  35. Жду, чел. вроде обещал убрать функцую из запроса, может извернется и сделает.

или зарегистрируйтесь чтобы ответить!