2015-04-30 4 views
0

это может показаться глупым, и я могу пропустить что-то важное, но вот оно.Размер поля запроса FireDac не обновляется при изменении sql

Я переношу старое программное обеспечение от BDE к Firedac, и я заметил некоторые странные поведения (XE6 VCL - Firedac).

Представьте себе:

У нас есть запрос, который имеет простой SQL (SQL1), этот запрос определяется во время разработки и имеет все поля, извлекаемые (3 поля - треск, дез и IMG). Во время выполнения я выполняю этот запрос и проверяю размер поля трески, отлично работает. Затем я меняю sql (SQL2) и продолжаю проверять размер нового размера трески, это также работает. Но если я снова изменил sql на SQL1 и проверил размер поля трески, он предполагает тот же размер второго размера поля запроса.

Я протестировал его в небольшом проекте, и это также происходит следующим образом. Fields retrieved on design time

(я поместил 2 кнопки и метку, чтобы проверить размер)

procedure TForm1.SQL1Click(Sender: TObject); 
begin 
    FDQuery1.Close; 
    FDQuery1.SQL.Clear; 
    FDQuery1.SQL.Text:='select grefcod as cod, grefdesc as des, grefimg as img from wtv'; 
    FDQuery1.Open; 
    sLabelFX1.Caption:=IntToStr(FDQuery1.FindField('COD').Size); 
end; 

procedure TForm1.SQL2Click(Sender: TObject); 
begin 
    FDQuery1.Close; 
    FDQuery1.SQL.Clear; 
    FDQuery1.SQL.Text:='select ATRBcod as cod, ATRBdes as des from wtv2 '; 
    FDQuery1.Open; 
    sLabelFX1.Caption:=IntToStr(FDQuery1.FindField('COD').Size); 
end; 

Во-первых я назвать SQL1Click, размер трески 20;

Второй вызов SQL2Click, размер трески 5;

Последнее, я снова вызываю SQL1Click и размер трески 5 -> Неверно.

Редактировать: Реальный размер SQL1-трески составляет 20 varchar, а реальный размер SQL2 - 5 varchar.

Странно, извините, если я не могу объяснить это лучше. В любом случае, если я удаляю извлеченные поля во время разработки, проблема не существует, и мне просто нужно изменить способ получения полей, но поскольку это гигантское программное обеспечение, это не то, что я хотел бы сделать.

ответ

0

Эта проблема была решена путем установки параметра «Обновить постоянство» в поле «Параметры проверки подлинности» на поле «FieldOptions».

Я действительно не знаю, было ли это предназначение, но теперь оно работает.

1

Это стандартное поведение (не говоря о том, что это правильно, только так оно работает) при использовании постоянных полей (созданных во время разработки с помощью Редактор полей). После создания полей они не обновляются с изменениями, если они не удалены (опять же с использованием Редактор полей); вместо этого размер просто считывается из определения поля, хранящегося в .DFM. Это не FireDAC; это была проблема навсегда при использовании постоянных полей.

Самый простой способ исправить это просто использовать полевой редактор , удалить определение поля и повторно добавить его.

+0

Когда мы закончили мигрировать, мы получили много нарушений доступа, большинство полей были постоянными, и поскольку во время выполнения большого количества запросов обновляется/изменяется много запросов, мы заметили, что размер поля меняется на минимальный размер. В небольших проектах мы меняли вручную и удаляли постоянные поля. Но в более крупном программном обеспечении это не то, что мы хотели бы сделать. Как я уже сказал в другом ответе, установка опции «Обновить стойкость», похоже, разрешает эти проблемы. Во всяком случае, я ценю ваш вклад, спасибо. –