1

私は Pascal の学習を始めたばかりなので、明らかな何かを見逃していた場合は、私の無能さを許してください。

DB に接続し、アカウントのリストを取得して StringGrid に表示するプログラムがあります。グリッド内の行を選択すると、グリッドから返されたパラメーターを使用してさらに検索が実行されるように、プログラムを拡張しようとしています。

私はグリッドを正しくセットアップしました (私はそう思います!)。accountID 値を変数に書き込むことができ、それを使用してクエリを作成しています。

クエリを実行するときに segfault が発行され、その理由がわかりません。エラー メッセージは次のとおりです。

Project SQLConnect raised exception class 'External: SIGSEGV' at address 583166

アセンブラ ウィンドウには、次の gobbledygook が表示されます。

00583166 8b09                     mov    (%ecx),%ecx

データを返すために使用している手順は次のとおりです

行を選択する前の最初のリターン、これは機能します-それ自体で:

procedure TForm1.sendQueryClick(Sender: TObject);
begin
  CreateConnection;
  CreateTransaction;
try
  Query := GetQuery;
  Query.SQL.Text := 'SELECT * FROM tbl_accounts LEFT JOIN tbl_properties ON tbl_accounts.ClientID = tbl_properties.PropertyID LEFT JOIN tbl_clients ON tbl_accounts.ClientID = tbl_clients.ClientID ORDER BY tbl_accounts.AccountID DESC';
  AConnection.Open;
  Query.Open;
  while not Query.Eof do
  begin
     accID :=  Query.FieldByName('AccountID').AsString;
     accountNo := Query.FieldByName('AccountNumber').AsString;
     mortgagors := Query.FieldByName('Mortgagors').AsString;
     address :=  Query.FieldByName('Address').AsString;
     accResults.RowCount := accResults.RowCount + 1;
         accResults.Cells[0, accResults.RowCount - 1] := accID;
         accResults.Cells[1, accResults.RowCount - 1] := accountNo;
         accResults.Cells[2, accResults.RowCount - 1] := mortgagors;
         accResults.Cells[3, accResults.RowCount - 1] := address;
     Query.Next;
  end;
finally
    Query.Close;
    AConnection.Close;
    Query.Free;
    ATransaction.Free;
    AConnection.Free;
end;
end;

これは、segfault を引き起こす行選択クエリです。

procedure TForm1.accResultsSelectCell(Sender: TObject; aCol, aRow: Integer; var CanSelect: Boolean);
begin
 // Hide Account ID Column
 accResults.ColWidths[0] := 0;
 CurrCol := 0;
 CurrRow := aRow;
 // Grab Account ID value from cell
 CellValue := accResults.Cells[CurrCol, CurrRow];
 selectedRow.Text := CellValue;
 // Setup Query
 try
     TestQuery := GetQuery;
     TestQuery.SQL.Text := 'SELECT * FROM tbl_accounts LEFT JOIN tbl_properties ON tbl_accounts.ClientID = tbl_properties.PropertyID LEFT JOIN tbl_clients ON tbl_accounts.ClientID = tbl_clients.ClientID WHERE AccountID = :AccID';
     TestQuery.Params.ParamByName('AccID').AsString := CellValue;
 // Open Database connection
 AConnection.Open;
 TestQuery.Open;
 begin

 end;
 finally
        TestQuery.Close;
        AConnection.Close;
        TestQuery.Free;
        ATransaction.Free;
        AConnection.Free;
 end;
end;
4

1 に答える 1