2015-04-30 73 views
0

這聽起來很愚蠢,我可能會錯過重要的東西,但在這裏。FireDac查詢字段大小不更新sql更改

我正在將舊軟件從BDE遷移到Firedac,我注意到一些奇怪的行爲(XE6 VCL - Firedac)。

想象一下:

我們已經有一個簡單的SQL(SQL1)查詢,該查詢在設計時定義並具有檢索到的所有領域(3場 - 鱈魚,DES和IMG)。在運行時,我執行這個查詢,並檢查一個cod字段的大小,很好。然後我更改SQL(SQL2)並繼續檢查新的cod字段大小,這也適用。但是,如果我再次將SQL更改爲SQL1並檢查cod域的大小,它將假定第二個查詢字段大小的大小相同。

我已經在一個小項目中對它進行了測試,這種情況也會發生,如下所示。 Fields retrieved on design time

(I放置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和cod大小是5 - >錯誤。

編輯:SQL1 cod的實際大小是20 varchar,而SQL2的實際大小是5 varchar。

它很奇怪,如果我不能更好地解釋它,很抱歉。 無論如何,如果我在設計時刪除檢索到的字段,問題就不存在了,我只需要改變字段的獲取方式,但由於這是一個巨大的軟件,我不想這麼做。

回答

0

此問題已通過在FieldOptions上將查詢選項「更新持久性」設置爲true來解決。

我真的不知道這種行爲是否打算,但現在它的工作。

1

當使用持久字段(在設計時使用字段編輯器創建的字段)時,這是標準行爲(不是說它是正確的,只是它是如何工作的)。一旦創建了字段,它們就不會被更新,除非它們被刪除(再次使用Field Editor);相反,只是從存儲在.DFM中的字段的定義中讀取大小。這不是FireDAC特有的;使用持久字段時永遠是個問題。

修復它的最簡單方法就是使用Field Editor,刪除字段定義並重新添加它。

+0

當我們完成遷移時,我們獲得了很多訪問衝突,大多數字段是持久性的,並且由於很多查詢在運行時更新/更改,我們注意到字段大小正在變爲最小大小。在小型項目中,我們手動更改並刪除了持久性字段。但是在更大的軟件中,這不是我們想要做的事情。正如我在其他答案中所說的,設置「更新持久性」選項似乎可以解決此問題。無論如何,我感謝您的意見,謝謝。 –