0

Delphi XE5 Firedac アプリケーションに問題があります。ZTE Blade 3 電話を使用してアプリケーションを実行しています。デプロイメント マネージャーを使用して、データベース ファイルを assets\internal ディレクトリに追加しました。しかし、FDQuery1.FieldByName('Nimi').AsString を呼び出すと、例外 Segmentation fault (11).Thanks が発生します。

FDQuery1.SQL.Clear;
FDQuery1.SQL.Add('SELECT * FROM Laskuttaja');

FDQuery1.Open();
FDQuery1.First;
while(not FDQuery1.Eof) do begin
FormTiedot.EditNimi.Text := FDQuery1.FieldByName('Nimi').AsString;
FormTiedot.EditOsoite.Text := FDQuery1.FieldByName('Osoite').AsString;
FormTiedot.EditY.Text := FDQuery1.FieldByName('Ytunnus').AsString;
FDQuery1.Next;
end;
if FormTiedot.ShowModal = mrOk then begin
FDQuery1.SQL.Clear;
FDQuery1.SQL.Add('UPDATE Laskuttaja SET Nimi = '+QuotedStr(FormTiedot.EditNimi.Text)+', Osoite = ' + QuotedStr(FormTiedot.EditOsoite.Text) + ', Ytunnus=' + QuotedStr(FormTiedot.EditY.Text));
FDQuery1.SQL.Add('WHERE ID=1');
4

2 に答える 2

2

エラーは次の行で発生します。

FormTiedot.EditNimi.Text := FDQuery1.FieldByName('Nimi').AsString;

セグメンテーション違反は、無効なメモリを参照していることを意味します。そのため、これは次の理由の少なくとも 1 つが原因で発生する可能性があります。

  • FormTiedot無効です。
  • FormTiedot.EditNimi無効です。
  • FDQuery1無効です。
  • FDQuery1.FieldByName('Nimi')戻りますnil

現在、私が知る限り、をFieldByName()返すのではなく、失敗を示すために例外を発生させますnil。そうFDQuery1でなければ、以前のコードは失敗していたでしょう。

したがって、最も可能性の高い結論は、 または のいずれFormTiedotFormTiedot.EditNimiが無効であるということです。おそらくインスタンス化に失敗しましたFormTiedotか?

于 2013-12-31T14:46:48.837 に答える