Vadim спасибо, сейчас буду пробовать...
Добавлено спустя 1 час 3 минуты 48 секунд:Re: Lazarus 30 64 bit и Zeos 6.6.6. Error:Bookmark was not foundОтлично, помогло. Огромное спасибо.
Кстати, если кто работает с zeos и юзает PostgreSQL, может напороться на проблему парсинга запросов, в которых прописано приведение типа. (Например select field::bigint from table). Проблема состоит в том что зеос считает что на месте такого приведения типа стоит параметр, заменяет двойное двоеточие на одинарное, и выдает ошибку выполнения запроса.
SQL Error: ERROR: syntax error at or near ":"
СТРОКА 1:select id_portfolio:bigint, 'test':characte..
Чтобы обойти этот трабл можно подкорректировать сорсы компонента (
zeos 6.6.6, 7 - работает).
В модуле ZSqlStrings. Надо зменить метод TZSQLStrings.RebuildAll.
На
- Код: Выделить всё
procedure TZSQLStrings.RebuildAll;
var
Tokens: TStrings;
TokenValue: string;
TokenType: TZTokenType;
TokenIndex: Integer;
ParamIndex: Integer;
ParamIndices: TIntegerDynArray;
ParamIndexCount: Integer;
ParamName, SQL: string;
Tokenizer: IZTokenizer;
procedure NextToken;
begin
TokenType := TZTokenType({$IFDEF FPC}Pointer({$ENDIF}
Tokens.Objects[TokenIndex]{$IFDEF FPC}){$ENDIF});
TokenValue := Tokens[TokenIndex];
Inc(TokenIndex);
end;
begin
FParams.Clear;
FStatements.Clear;
SQL := '';
ParamIndexCount := 0;
SetLength(ParamIndices, ParamIndexCount);
{ Optimization for empty query. }
If Length(Trim(Text)) = 0 then
Exit;
{ Optimization for single query without parameters. }
if (not FParamCheck or (Pos(FParamChar, Text) = 0))
and (not FMultiStatements or (Pos(';', Text) = 0)) then
begin
FStatements.Add(TZSQLStatement.Create(Text, ParamIndices, FParams));
Exit;
end;
Tokenizer:=GetTokenizer;
Tokens := Tokenizer.TokenizeBufferToList(Text,
[toSkipComments, toUnifyWhitespaces]);
try
TokenIndex := 0;
repeat
NextToken;
{ Processes parameters. }
if ParamCheck and (TokenValue = FParamChar) then
begin
NextToken;
if (TokenType <> ttEOF) and (TokenValue <> FParamChar) [b]and (TokenValue <> '=')[/b] then
begin
{ Check for correct parameter type. }
if not (TokenType in [ttWord, ttQuoted]) then
raise EZDatabaseError.Create(SIncorrectToken);
SQL := SQL + '?';
ParamName := TokenValue;
if (ParamName <> '') and (ParamName[1] in [#39, '`', '"', '[']) then
begin
ParamName := Tokenizer.GetQuoteState.
DecodeString(ParamName, ParamName[1]);
end;
ParamIndex := FindParam(ParamName);
if ParamIndex < 0 then
ParamIndex := FParams.Add(ParamName);
Inc(ParamIndexCount);
SetLength(ParamIndices, ParamIndexCount);
ParamIndices[ParamIndexCount - 1] := ParamIndex;
Continue;
end
[b]else
if (TokenType <> ttEOF) and ((TokenValue = ':') or (TokenValue = '=')) then
SQL := SQL + ':';[/b]
end;
{ Adds a DML statement. }
if (TokenType = ttEOF) or (FMultiStatements and (TokenValue = ';')) then
begin
SQL := Trim(SQL);
if SQL <> '' then
FStatements.Add(TZSQLStatement.Create(SQL, ParamIndices, FParams));
SQL := '';
ParamIndexCount := 0;
SetLength(ParamIndices, ParamIndexCount);
end
{ Adds a default token. }
else
SQL := SQL + TokenValue;
until TokenType = ttEOF;
finally
Tokens.Free;
end;
end;
(с) исправления Оldwayder