type
  TForm1 = class(TForm)
    Button1: TButton;
    DBGrid1: TDBGrid;
    Table1: TTable;
    DataSource1: TDataSource;
    Query1: TQuery;
    Label1: TLabel;
    procedure DBGrid1DblClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('delete from 基本表.db where ID='+DBGrid1.Fields[0].AsString+';');
Query1.ExecSQL;
label1.Caption:=DBGrid1.Fields[0].AsString;
end;end.
我用如上的一个TQuery删除DBGrid选中的一条记录
总是出现错误下面
Access violation at address 004AFF5F in module 'Project1.exe'. Read of address 00000000.
请问什么?
如果想在选中的DBGrid中删除一条记录怎么办?(用TQuery,而不是用TTable,因为我实际上还要删除另外一个表里面和这张表有一样ID的记录,即实际是是
'delete from 基本表.db,获奖情况表,处罚情况表 where ID='+DBGrid1.Fields[0].AsString+';')
谢谢!!!

解决方案 »

  1.   

    你的DBGrid1一定是和Query1关联的,因为Query1.Close
    该操作已经使DBGrid1的Fields.count=0,因此再调用DBGrid1.Fields[0]出现地址错误.可以着样做,把Query1.RequestLive设置为True;
    然后:
    DBGrid1DblClick(sender TObject)
    begin
      if not Query1.IsEmpty then
       begin
        Query2.Clear;
        Query2.SQL.Text := 'DELETE FROM 其他表 WHERE ID='+Query1.FieldByName('ID').AsString;
        Query2.ExecSql;
        ...
        Query1.Delete;
       end;
    end;
    就可以了
      

  2.   

    Query1.SQL.Add('delete from 基本表.db where ID='+DBGrid1.Fields[0].AsString+';');
    这句去掉分号试试看。
      

  3.   

    该成这样试一下~
    procedure TForm1.DBGrid1DblClick(Sender: TObject);
    begin
    Query1.Close;
    Query1.SQL.Clear;
    Query1.SQL.Add('delete from 基本表.db where ID='+DBGrid1.Fields[0].AsString);
    Query1.Prepare;
    Query1.Open;
    label1.Caption:=DBGrid1.Fields[0].AsString;
    end;
      

  4.   

    query1是窗體上放的吧,你自己調試一下,看上去沒什麼問題呀。