|
как прочитать значение в 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 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |