Найдено 4 результата

vostden
Пн 07 май 2018 09:01
Форум: Oracle Data Access Components
Тема: Locate и Assertion failure line 2573
Ответы: 1
Просмотры: 10061

Locate и Assertion failure line 2573

Доброго времени суток!

Наша команда работает на Delphi 2010 и ODAC 10.0.2
Проблема следующая:
Есть датасет TOraQuery.
В нём в дизайнере объявлены поля. Одно из полей - "MyLookUpField" - является lookup - полем. Так же есть вычисляемое поле "MyCalcField" (calculated) и задан обработчик OnCalcFields.
Далее в рантайм датасет открывается, но по условию выборки не было возвращено ни одной записи - т.е. датасет пуст.
Далее мы вызываем метод Locate('MyCalcField', Null, []). Автоматически запускается обработчик OnCalcFields. в нём идёт присваивание

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

DataSet.FieldByName('MyCalcField').AsString := DataSet.FieldByName('Field1').AsString + ' ' 
+ DataSet.FieldByName('Field2').AsString;
И вот тут возникает ошибка:
"Assertion failure (D:\Projects\Delphi\Dac\Common\Source\MemData.pas, line 2573)"

По стеку частично видно, что всему этому предшествует вызов lookup от поля MyLookUpField. Должно ли это происходить при пустом датасете?
Если убрать из Fields лукап поле, то ошибки Assertion failure не возникает.. Датасет на который ссылается лукап-поле открыт и стабильно в dsBrowse (т.е. проблема явно не в нём).

К сожалению не удалось воспроизвести на демо проекте.
Два главных вопроса:
1. Если TOraQuery пуст и делается Locate по calc-полю, должны ли происходить вызовы lookup, до входа в обработчик OnCalcFields?
2. Если даже Assertion failure не происходит, то по DataSet.Field.AsString возвращаются мусорные данные. Является ли это багом? Ведь NullAsStringValue = ''.
Прикладываю демо проект, где это прослеживается.

Оконечный стек при Assertion failure:

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

:775cc54f KERNELBASE.RaiseException + 0x58
:06e00d09 RaiseExceptionProcHook + $71
:06a3e1a0 TData.GetFieldData + $188
:06b05115 TCRRecordSet.GetFieldData + $1ED
:07509808 TOCIRecordSet.GetFieldData + $90
:06a3e3f0 TData.GetField + $D4
:06aa168d TMemDataSet.GetFieldData + $85
vostden
Пн 29 янв 2018 09:23
Форум: Oracle Data Access Components
Тема: Ошибка dac140.bpl AddRefStr failed (D:\Projects\Delphi\Dac\Common\Source\MemData.pas)
Ответы: 1
Просмотры: 10352

Ошибка dac140.bpl AddRefStr failed (D:\Projects\Delphi\Dac\Common\Source\MemData.pas)

Установлен ODAC 10.1.4.

Периодически возникает ошибка:
AddRefStr failed (D:\Projects\Delphi\Dac\Common\Source\MemData.pas, line 8624)


К сожалению, алгоритм воспроизведения - неизвестен.
Предположительно, при вызове метода Cancel у TOraQuery.

Вариации Call stack:

1. Здесь ошибки не было

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

U_ILL.TFrm_ILL.O_ILLBeforeCancel($13A15D20)
:506947ef TDataSet.DoBeforeCancel + $1B
:0546794a TDASQLGenerator.GenerateRefreshSQLFromPart + $A
2. Тот же блок кода, что и в п.1., но уже имеем ошибку

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

:7616c54f KERNELBASE.RaiseException + 0x58
:05b90d09 RaiseExceptionProcHook + $71
:0536bdf2 TStringHeap.ReAllocWideStr + $2
с результирующим сообщением "AddRefStr failed (D:\Projects\Delphi\Dac\Common\Source\MemData.pas)"
---
Возможно пригодятся данные с CPU

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

; Memdata.TStringHeap. (possible DisposeBuf+560) (Line=0 - Offset=560)
; --------------------------------------------------------------------
05C0BDC0  6C          INSB
05C0BDC1  006500      ADD   [EBP], AH
05C0BDC4  640000      ADD   FS:[EAX], AL
05C0BDC7  005356      ADD   [EBX+$56], DL
05C0BDCA  85D2        TEST  EDX, EDX
05C0BDCC  742A        JZ    +$2A                 ; ($05C0BDF8) Memdata.TStringHeap.AddRef (Line=0)
05C0BDCE  8BDA        MOV   EBX, EDX
05C0BDD0  83C3FE      ADD   EBX, -2
05C0BDD3  8BC3        MOV   EAX, EBX
05C0BDD5  0FB730      MOVZX ESI, WORD PTR [EAX]
05C0BDD8  6683FE65    CMP   SI, $65
05C0BDDC  7314        JNB   +$14                 ; ($05C0BDF2) Memdata.TStringHeap.AddRef (Line=0)
05C0BDDE  B924220000  MOV   ECX, $00002224
05C0BDE3  BA08BEC005  MOV   EDX, $05C0BE08       ; ($05C0BE08) Memdata.TStringHeap. (possible AddRef+64) (Line=0) UNICODE: 'C:\Users\dev15\Documents\!DbgFiles\odac_src\odac101src\ODAC\Source\MemData.pas'
05C0BDE8  B8B4BEC005  MOV   EAX, $05C0BEB4       ; ($05C0BEB4) Memdata.TStringHeap. (possible AddRef+236) (Line=0) UNICODE: 'AddRefStr failed'
;
; Memdata.TStringHeap.AddRef (Line=0 - Offset=37)
; -----------------------------------------------
05C0BDED  E8BE53FDFF  CALL  -$02AC42             ; ($05BE11B0->5000B904) System.Assert  ; <-- EXCEPTION
05C0BDF2  8BC3        MOV   EAX, EBX
05C0BDF4  46          INC   ESI
05C0BDF5  668930      MOV   [EAX], SI
05C0BDF8  5E          POP   ESI
05C0BDF9  5B          POP   EBX

; ------------------
056FBBE2  E8C955FDFF    CALL  -$02AA37             ; ($056D11B0->5000B904) System.Assert  ; <-- EXCEPTION
056FBBE7  6683FB65      CMP   BX, $65
056FBBEB  0F8580000000  JNZ   +$80                 ; ($056FBC71) Memdata.TStringHeap.DisposeBuf (Line=0)
056FBBF1  8BC6          MOV   EAX, ESI
056FBBF3  4B            DEC   EBX
056FBBF4  668918        MOV   [EAX], BX
056FBBF7  8BC6          MOV   EAX, ESI
056FBBF9  83C0FC        ADD   EAX, -4
056FBBFC  8B00          MOV   EAX, [EAX]
056FBBFE  8D5808        LEA   EBX, [EAX+8]
056FBC01  4B            DEC   EBX
056FBC02  85DB          TEST  EBX, EBX
056FBC04  7903          JNS   +3                   ; ($056FBC09) Memdata.TStringHeap.DisposeBuf (Line=0)
056FBC06  83C307        ADD   EBX, 7
056FBC09  C1FB03        SAR   EBX, 3
056FBC0C  85DB          TEST  EBX, EBX
056FBC0E  7514          JNZ   +$14                 ; ($056FBC24) Memdata.TStringHeap.DisposeBuf (Line=0)
Предоставим любую необходимую информацию для решения вопроса.
Спасибо!
vostden
Пн 29 янв 2018 06:35
Форум: Oracle Data Access Components
Тема: Возникновении ошибки Assertion failure (MemData.pas, line 7245))
Ответы: 4
Просмотры: 12491

Re: Возникновении ошибки Assertion failure (MemData.pas, line 7245))

Доброго времени суток!
На ODAC билд 10.1.4 ошибка по-прежнему возникает. На том же коде, что из первого поста.
Пожалуйста, проверьте повторно.
vostden
Чт 28 дек 2017 06:13
Форум: Oracle Data Access Components
Тема: Возникновении ошибки Assertion failure (MemData.pas, line 7245))
Ответы: 4
Просмотры: 12491

Возникновении ошибки Assertion failure (MemData.pas, line 7245))

Приветствую разработчиков!
Имеем версию ODAC 10.1.3. Ошибка возникает при использовании фильтра на датасете.

Для воспроизведения ошибки:
DFM

object oqFindData: TOraQuery
SQL.Strings = (
'select '#39'AAA'#39' name, 0 chk from dual'
'union select '#39'BBB'#39' name, 1 chk from dual')
OnFilterRecord = oqFindDataFilterRecord
Left = 88
Top = 248
end

Код

var
sMatch: string; // global

procedure TForm1.oqFindDataFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
Accept := (Pos(UpperCase(sMatch), UpperCase(DataSet.FieldByName('name').AsString) ) > 0);
end;

procedure TForm1.btnStep1Click(Sender: TObject);
begin
sMatch:= 'AAA';
oqFindData.Open;
oqFindData.Filtered := False;
oqFindData.Filter:= '';
oqFindData.Filtered := True;
oqFindData.Edit;
oqFindData.FieldByName('chk').Value := 1;
end;

procedure TForm1.btnStep2Click(Sender: TObject);
begin
sMatch := '';
oqFindData.Filtered := False;
oqFindData.Filter:= '';
end;

Последовательно нажимаем btnStep1 и btnStep2. При клике на второй кнопке вылетает ошибка:
Assertion failure (D:\Projects\Delphi\Dac\Common\Source\MemData.pas, line 7245).

Будем благодарны за исправление этой ошибки.