1

我才刚刚开始学习 Pascal,所以如果我错过了一些明显的东西,请原谅我的无能。

我有一个连接到数据库的程序,检索帐户列表并将它们显示在 StringGrid 中。我现在正在尝试扩展程序,以便在网格中选择一行将使用从网格返回的参数执行进一步的搜索。

我正确设置了网格(我认为!),我设法将 accountID 值写入变量并使用它来构造查询。

当运行查询时发出段错误,我不明白为什么,错误消息是

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

Assembler 窗口显示以下 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;

这是导致段错误的行选择查询:

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

0

IIRC:确保参数的类型不是 ftunknown。

于 2013-07-28T15:37:12.523 回答