使用TDataSetProvider、TClientDataSet和TSQLQuery控件对firebird数据库进行操作,在FormCreate时,使用了下属语句对各控件进行了设置:
procedure TForm1.FormCreate(Sender: TObject);
begin
DBGrid1.DataSource := DataSource1;
DataSource1.DataSet := ClientDataSet1;
ClientDataSet1.ProviderName := 'DataSetProvider1';
DataSetProvider1.DataSet := SQLQuery1;
SQLQuery1.SQLConnection := SQLConnection1;
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('Select * from Biao');
SQLQuery1.Open;
ClientDataSet1.Open;
end;利用下面的语句删除数据:ClientDataSet1.Delete;
ClientDataSet1.ApplyUpdates(0);
用上面的语句也只能将内存中的数据删除,重新打开数据库时,发现曾经删除了的数据还在数据库里。据说若数据表没有设主键,可能导致用这种方法不能删除数据,可是在数据表上设主键后还是不行。
若是将代码写成下面这样:
Clientdata1.Delete;
Clientdata1.Applyupdates(0);
ClientDataSet1.Refresh;
执行后会出现下列提示信息:
ClientDataSet1:must applyupdates before refreshing data.

解决方案 »

  1.   

    看下帮助吧:
    TSQLQuery is a unidirectional dataset. Unlike other datasets, unidirectional datasets do not buffer multiple records in memory. Because of this, you can only navigate using the First and Next methods. There is no built-in editing support: you can only edit the data in an SQL query by explicitly creating an SQL UPDATE command or by connecting the dataset to a client dataset using a provider. Features that require buffering multiple records, such as filters or lookup fields, are not available.
      

  2.   

    我是使用ClientDataSet控件,而不是SQLQuery,上面一段代码是将表里的数据全部提取到内存中,我正是利用下面的方法:
    by connecting the dataset to a client dataset using a provider. 
      

  3.   

    你这种情况只能这样删除
    Clientdata1.close;
    Clientdata1.commandtext:='delete from biao';
    Clientdata1.execute;如果Clientdata1服务器端直接对应的是表,你可以
    Clientdata1.Delete;
    Clientdata1.Applyupdates(0);
    这样删除
      

  4.   

    Clientdata1.commandtext:='delete from biao';
    这样删除的是一个表,而要删除的是当前的记录。
    如果Clientdata1服务器端直接对应的是表,???
    ClientDataSet1是与数据源连着,连的就是数据库里的一个表。
      

  5.   

    ClientDataSet1.ProviderName := 'DataSetProvider1';
    DataSetProvider1.DataSet := SQLQuery1;设置DataSetProvider1的数据集是Table类组件才行,你SQLQuery1是一个表组件而不是一个查询组件?明明就是一个查询组件
    Clientdata1.commandtext:='delete from biao';
    你都知道是删除整个表的,你不能带条件?commandtext执行的就是SQL语句,
    Clientdata1.commandtext:='delete from biao where xxxx';
      

  6.   

    Clientdata1.commandtext:='delete from biao where xxxx';
    要取出当前的记录,但是试过下面这样却不行:
    ClientDataSet1.DataSet.CommandText:='delete wjzl where wjzl_id='''+ClientDataSet1.FieldByName('wjzl_id').value+'''';
      

  7.   

    这位哥哥,
    Clientdata1.close;
    Clientdata1.commandtext:='delete 。都先执行了Close了,怎么能取到当前记录?
    你加一个变量啊,在Close之前取得当前记录的某个字段值,比如
    Str_ID:=ClientDataSet1.FieldByName('wjzl_id').AsString;
    Clientdata1.close;
    Clientdata1.commandtext:='delete wjzl where wjzl_id='''+Str_ID+'''';
      

  8.   

    Str_ID:=ClientDataSet1.FieldByName('wjzl_id').AsString;
    ClientDataSet1.close;
    ClientDataSet1.commandtext:='delete wjzl where wjzl_id='''+Str_ID+'''';
    ClientDataSet1.Execute;
      

  9.   

    Str_ID:=ClientDataSet1.FieldByName('wjzl_id').AsString;
    ClientDataSet1.close;
    ClientDataSet1.commandtext:='delete from wjzl where wjzl_id='''+Str_ID+'''';
    ClientDataSet1.Execute;
      

  10.   

    用以下代码能将数据插入内存,却不能将记录写进数据库。
      with  ClientDataSet1  do
     begin
     insert;
     FieldByName('biaoti').AsString:=Edit1.Text;
     FieldByName('wang').AsString:=Edit2.Text;
     FieldByName('leibie').AsString:=Edit3.Text;
     FieldByName('yong').AsString:=Edit4.Text';
     Post;
     end;
    ClientDataSet1.ApplyUpdates(0);用以下代码是将SQL语句送入数据库,并不能将内存里的记录删除,但由于数据库里没有数据,也不知以下代码是否好使。
    Str_ID:=ClientDataSet1.FieldByName('wjzl_id').AsString;
    ClientDataSet1.close;
    ClientDataSet1.commandtext:='delete from wjzl where wjzl_id='''+Str_ID+'''';
    ClientDataSet1.Open;
      

  11.   

    5楼已经说过了DataSetProvider1.DataSet 对应的是Table组件才能用
     with ClientDataSet1 do
     begin
     insert;
     FieldByName('biaoti').AsString:=Edit1.Text;
     FieldByName('wang').AsString:=Edit2.Text;
     FieldByName('leibie').AsString:=Edit3.Text;
     FieldByName('yong').AsString:=Edit4.Text';
     Post;
     end;
    ClientDataSet1.ApplyUpdates(0);如果是查询类组件,你要插入数据得用SQL语句:insert into ...
    ClientDataSet1.Execute;而不是ClientDataSet1.Open;