簡體   English   中英

Delphi Rio 10.3.2 Android FireDac SQLITE 無法打開查詢 - 使用相同的 Android 設備與 Delphi Tokyo 使用相同的代碼

[英]Delphi Rio 10.3.2 Android FireDac SQLITE unable to open query - same code worked with Delphi Tokyo with same android device

這是使用 Delphi Tokyo 編譯時完美運行的非常簡單的代碼:

procedure TfData.DataSend(Memo : TMemo);
var SelectQuery : string;
begin
    // Query simplified, more fields are retreived in original code, but same problem with simple query
    SelectQuery := 'SELECT NUM as "NUM::TEXT" FROM TRACE WHERE DT_SENT is null ORDER BY DT_TRACE';
    YsDbQuerySelect.SQL.Clear;
    YsDbQuerySelect.SQL.Add(SelectQuery);
    YsDbQuerySelect.Prepare;
    try
      YsDbQuerySelect.Open;
      if YsDbQuerySelect.RecordCount > 0 then begin // I get 6 records here
        YsDbQuerySelect.First; // ********** Exception !

        while not YsDbQuerySelect.eof do begin    
         // making a file... code removed, not relevant          
          YsDbQuerySelect.Next;
        end;
        YsDbQuerySelect.Close;
      end
      else begin
        YsDbQuerySelect.Close;
        MesInfo('No data to send');
      end;
    except
      on e : exception do begin
        // Exception displays the annoying error
        MesError(e.Message + ' SLQ : ' + SelectQuery);
      end;
    end;
end;

使用 Tokyo 10.3.2 編譯時,運行在相同真實 android 設備(Zebra TC25)上的相同簡單代碼不再起作用。 “RecordCount”方法返回 6,但是,“First”方法觸發異常:類似於“無法在封閉的數據集上執行此操作”,原始消息是法語:“Impossible d'effecteur cette opération sur un ensemble de唐尼斯·費爾梅"

我無法理解“RecordCount”如何在“First”觸發此異常時返回某些內容。 數據庫中確實有6條記錄。 我也刪除了然后重新創建了它們。 同樣的錯誤。 我嘗試使用一些選項(獲取選項等),但沒有任何效果。 這真的很煩人。

另請注意,其他操作在同一個 SQLite 數據庫上正常工作。 設備能夠使用 TDFCommand 添加和刪除記錄,並使用 TDataSource 顯示它們。 只有 TDFQuery 遇到錯誤。

理想情況下,您應該將代碼重新編寫為

YsDbQuerySelect.Open;
while not YsDbQuerySelect.eof do begin    
  // making a file... code removed, not relevant          
  YsDbQuerySelect.Next;
end;
YsDbQuerySelect.Close;

原因是

if YsDbQuerySelect.RecordCount > 0 then begin 
  YsDbQuerySelect.First

應該完全沒有必要,因為 a) 如果查詢返回零條記錄, YsDbQuerySelect.eof將立即返回 False,因此while循環將永遠不會執行 b) 如果查詢確實返回任何記錄,則 FDQuery 的數據集游標將位於第一條記錄上所以調用First是多余的。

在任何情況下,一般來說,讓類似 TQuery 的數據集的行為依賴於它的RecordCount變量是不好的做法,因為它可能不可靠且效率極低,因為它可能導致數據集檢索所有匹配的記錄。

如果您絕對必須檢查查詢是否返回記錄並向用戶發送消息,如果沒有,請簡單地替換您的

if YsDbQuerySelect.RecordCount > 0 then begin // I get 6 records here
  YsDbQuerySelect.First; // ********** Exception !
[etc]

經過

if not YsDbQuerySelect.Eof then begin
  // your while not eof loop
end
else begin
  MesInfo('No data to send');
end;

順便說一句,我認為您不應該將您在自己的答案中描述的內容視為問題的解決方案,因為如果您的行為是由於 .DFM 文件的損壞(我懷疑),它可能同樣容易再次發生。

我刪除了 TDFQuery 組件,然后刪除了一個新組件。 這有點奇怪,但它正在工作。 我認為這與 Delphi Rio 無關,而是與損壞的文件有關?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM