使用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.
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.
解决方案 »
- 為什麼TAdoqeury.CursorLocation := clUseServer時不能使用事務處理??
- 请问高手如何用代码为DBGrid的某一字段的PickList属性添加项目?
- 用find error查找地址冲突异常的发生处可行吗?
- 兄弟,姐妹们请帮帮我?
- 请问listview中我用multiseleted = true 后,如何对选中的进行删除
- (斑竹留情)多谢各位帮我评述简历,再送分!一天结贴
- Delphi调用win32函数的帮助borland公司提供了吗?
- wise打包中的dcom95以及mdac26sp1问题?
- 如何在D5中建立SQL7。0的临时表,ADO+MSSQL7!!急!!!!!!!!!!!!!!!
- 大家来帮帮忙呀!请问在MADIS中,客户端查询问题。
- 关于ApplyUpdates
- 串口通信,鸭梨很大。电子秤问题。。
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.
by connecting the dataset to a client dataset using a provider.
Clientdata1.close;
Clientdata1.commandtext:='delete from biao';
Clientdata1.execute;如果Clientdata1服务器端直接对应的是表,你可以
Clientdata1.Delete;
Clientdata1.Applyupdates(0);
这样删除
这样删除的是一个表,而要删除的是当前的记录。
如果Clientdata1服务器端直接对应的是表,???
ClientDataSet1是与数据源连着,连的就是数据库里的一个表。
DataSetProvider1.DataSet := SQLQuery1;设置DataSetProvider1的数据集是Table类组件才行,你SQLQuery1是一个表组件而不是一个查询组件?明明就是一个查询组件
Clientdata1.commandtext:='delete from biao';
你都知道是删除整个表的,你不能带条件?commandtext执行的就是SQL语句,
Clientdata1.commandtext:='delete from biao where xxxx';
要取出当前的记录,但是试过下面这样却不行:
ClientDataSet1.DataSet.CommandText:='delete wjzl where wjzl_id='''+ClientDataSet1.FieldByName('wjzl_id').value+'''';
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+'''';
ClientDataSet1.close;
ClientDataSet1.commandtext:='delete wjzl where wjzl_id='''+Str_ID+'''';
ClientDataSet1.Execute;
ClientDataSet1.close;
ClientDataSet1.commandtext:='delete from wjzl where wjzl_id='''+Str_ID+'''';
ClientDataSet1.Execute;
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;
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;