Имя: Пароль:
1C
1С v8
как прочитать значение в recordset (firebird)
,
0 alf2006x
 
06.08.13
10:07
Приветствую всех.

Столкнулся с неприятностью. Делаю запрос в базу firebird с параметром returning N, который должен возвращать в Recordset номер новой записи. Возврат получаю, но при попытке прочитать его
Сообщить(""+Записи.Fields(0).Value);
вылетает ошибка:
{Форма.НовыйСотрудник.Форма(31)}: Ошибка при получении значения атрибута контекста (Value)
    Сообщить(""+Записи.Fields(0).Value);
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [ODBC Firebird Driver]Invalid cursor state

Причем, если останавливаюсь в отладчике на этой строке и прохожу её пошагово - то ошибка не появляется (чудеса).

И после первого прогона отладчика, пока Соединение остаётся открытым - ошибка не появляется даже если больше не тормозить отладчиком на этой строке. Стоит Закрыть/Открыть соединение - снова ошибка и снова избежать её можно только тормознув отладчиком.
Очень хотелось бы как-нибудь исключить отладчик из алгоритма моей обработки :-)

Попытка перед этим выполнить Записи.MoveFirst() приводит к точно такой же ошибке (Invalid cursor state)

Заранее спасибо.
1 ДенисЧ
 
06.08.13
10:09
запрос покажи
2 Лодырь
 
06.08.13
10:11
а если просто повесить некое ожидание?
3 alf2006x
 
06.08.13
10:17
insert into clitab (N, CODE, F_NAME, S_NAME, M_NAME) values (0, 66945368, 'Иванов', 'Иван', 'Иванович') returning N
4 alf2006x
 
06.08.13
10:18
что-то мне подсказывает, что курить надо в сторону
5 alf2006x
 
06.08.13
10:18
CursorType    Содержит тип курсора. Может быть изменено только до открытия объекта Recordset. Возможные значения - см. описание аргумента CursorType события WillExecute объекта Connection.
6 Кирпич
 
06.08.13
10:22
может это поможет

Если в операторе изменения данных (INSERT, UPDATE OR INSERT, UPDATE, DELETE) присутствует оператор RETURNING, то оператор представляется как процедура, следовательно программная прослойка для работы с сервером должна поддерживать оператор EXECUTE PROCEDURE.
7 Кирпич
 
06.08.13
10:23
пардон. не то. как обычно, не читал вопроса.
8 alf2006x
 
06.08.13
11:21
(2) Добавление ожидания
Для Сч = 1 По 10000 Цикл
  Состояние("Ждем чего-то ещё "+Сч+" раз");
КонецЦикла;
9 alf2006x
 
06.08.13
11:21
... не помогло
10 Кирпич
 
06.08.13
11:27
(0)выкладывай свою писанину. чего гадать на кофейной гуще
11 alf2006x
 
06.08.13
12:10
ТекСтрока = "DRIVER=Firebird/InterBase(r) driver; UID="+СокрЛП(Логин)+"; PWD="+СокрЛП(Пароль)+"; DBNAME="+ПутьКфайлуБД+";";
    
Соединение.ConnectionString = ТекСтрока;
Соединение.ConnectionTimeout = 15;
Соединение.CursorLocation = 3;
    
Попытка
    Соединение.Open();
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;

Записи = Соединение.Execute("insert into clitab (N, CODE, F_NAME, S_NAME, M_NAME) values (0, 66945368, 'Иванов', 'Иван', 'Иванович') returning N");
Сообщить(""+Записи.Fields(0).Value);


Последняя строка выдаёт ошибку
{Форма.НовыйСотрудник.Форма(31)}: Ошибка при получении значения атрибута контекста (Value)
   Сообщить(""+Записи.Fields(0).Value);
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [ODBC Firebird Driver]Invalid cursor state

Пытался сделать Записи.MoveFirst() - не помогает. Та же самая ошибка.
При этом, если я торможу на этой строке отладчиком и иду пошагово - то ОШИБКА НЕ ПОЯВЛЯЕТСЯ (!)
А просмотр в табло выражения "Записи.Fields(0).Value" выдаёт номер новой записи!

Уже всю голову себе поломал, но решения найти не могу.

1С:Предприятие 8.2 (8.2.16.368)
Firebird 2.5.1.26351  (x64)
Firebird ODBC Driver v2.0 (2.00.02.153)
12 МихаилМ
 
06.08.13
12:36
какой тип курсора до и после выполнения запроса.
13 alf2006x
 
06.08.13
12:43
(12) Переменная "Записи" до исполнения запроса - пустая. После исполнения содержит Recordset с типом курсора CursorType = 3
14 Серго62
 
06.08.13
13:04
Попробуй Сообщить(Записи.GetString)
15 Jaap Vduul
 
06.08.13
13:11
Используй вместо рекордсета объект Command с output параметром.
16 alf2006x
 
06.08.13
13:25
(14) {Форма.НовыйСотрудник.Форма(198)}: Ошибка при вызове метода контекста (GetString)
    Сообщить(Записи.GetString());
по причине:
Произошла исключительная ситуация (ADODB.Recordset): BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись.
17 Кирпич
 
06.08.13
13:33
(16) в (15) тебе правильно советуют
18 alf2006x
 
06.08.13
13:59
(17) пошёл разбираться...
19 Infsams654
 
06.08.13
14:23
А зачем вообще делать Сообщить после инсерта ?
20 alf2006x
 
06.08.13
15:40
(19) вообще сообщать как раз не надо.
Но нужен код вставленной в таблицу строки, который должен возвращаться при помощи Returning N (и как показывает отладчик - он возвращается).
Этот код привязывается к Сотруднику в базе 1С. А получить код (не прибегая к помощи отладчика) пока никак не получается.
21 Infsams654
 
06.08.13
16:38
(20) ну видимо этот odbc-драйвер не поддерживает returning. Тогда простой выход - проинсертил, потом прочитал.
22 alf2006x
 
07.08.13
09:43
(21) отладчиком то я вижу возвращённый код, вот в чём загадка
23 НаборДанных
 
07.08.13
09:54
Дак он если тебе курсор вернул, где movenext?
24 spectre1978
 
07.08.13
10:00
знаешь на что похоже? Похоже на то что данные извлекаются в асинхронном режиме, поэтому пока ты смотришь отладкой - операция успевает завершиться, а в рабочем режиме нет. Посмотри значение свойства ExecuteOptions рекордсета и поотрубай там все что связано с async.
25 Torquader
 
07.08.13
23:49
У FireBird есть проблема с возвратом данных из исполняемых процедур причём именно через ODBC - там просто ничего не возвращается.
А для выборки в FireBird есть SELECT-процедуры, которые возвращают значения в процессе выполнения по команде SUSPEND