updatesql控件
当Query的数据集为只读的时候,如果要修改数据,可以利用UpdateSql.
1.将Query 的CacheUpdate设为True;UpdateObject设为UpdateSql1;
2.双击Updatesql1弹出编辑器,在'sql'标签中编写修改数据的sql语句如:
update temptable set custNo = :custNo where custNo = :OLD_custNo
3.然后在程序中修改数据;
如;Query1.edit;
Query1.FieldByname('Field1').asstring:='ff';
Query1.post;
Query1.ApplyUpdates;
如此OK,即可改变数据库中的值。
原理:Query1的数据集虽然是只读的,但利用缓冲(CacheUpdate)可以将修改值保存在其Delta中后用Post,ApplyUpdates来将修改值更新至实际数据库中的值.此时Query1将根据操作(修改删除插入从UpdateSql中寻找相应的SQl语句,并通过BDE传递至后台数据库中实际执行,这样达到修改只读数据集的目的。
Query.sql.add('select * from table1 as T join Table2 as T2' )
Query.open;//该数据集即为只读
因为主要是设置属性,源码很简单和普通的一样.操作步骤:
1.拖拉3个控件:Tquery,Tdatabase,TUpdateSql,名分别为:query1,database1,UpdateSql1
(BDE面板上)
2.设置Database1属性:aliaseName:DBDEMOS ,DatabaseName:DB,
设置Query1属性:DataBaseName:=DB,
SQL:='Select C.*,o.* from Customer as c join orders as o on C.Custno=O.custno'
CacheUpdate设为True;UpdateObject设为UpdateSql1;
3.双击Updatesql1控件,弹出对话框;按generate Sql,切换至'sql'标签
选择Modify 修改sql语句:
update customer
set
CustNo = :CustNo,
Company = :Company,
Addr1 = :Addr1,
Addr2 = :Addr2,
City = :City,
State = :State,
Zip = :Zip,
Country = :Country,
Phone = :Phone,
FAX = :FAX,
TaxRate = :TaxRate,
Contact = :Contact,
LastInvoiceDate = :LastInvoiceDate
where
CustNo = :OLD_CustNo
按确定
4.拖拉TBotton,TDBGRid,TDataSource至窗体名为(Btn1,Grid1,Datasource1)
连接Grid1.datasource:=Datasource1;Datasource1.dataset:=Query1
5.BtnOnlick事件:
query1.open;
Query1.First
Query1.edit;
Query1.FieldByname('Company').asstring:='company china';
Query1.post;
Query1.ApplyUpdates;
1.updatesql用于数据集是只读, 不能用正常的方法直接修改 我举的例子是从两个表选出的数据,是只读的 只是为了说明updatesql的用途.其他任何只读数据集都可以用updatesql来修改
2.对数据集中数据的赋值是通过其他任何一种修改数据的方法进行,和其他的数据修改一样, 如FieldByName('custno').asstring:='ffff'或通过DBEDit,dbgrid 等等,也就是只读的数据集从表面上和其他数据集没什么两样.只是在更新修改的数据时,新赋的值自动赋给updatesql的sql 语句中的参数如:custno等,然后updatesql自动执行sql语句更新后台数据库
3.这个只是根据你的需要,因为只读数据集通常是从两个表中选出的数据,
4.:custNo参数接受的是你的要赋的新值 .如果你修改的正好是where 内的关键字段,如果用where custno=:custno此时:custno是新值,那么sql语句就无法找到原来的记录了.为了找到原来的那条记录就要用此记录关键字段未改变前的数据值,updatesql自动记录各字段的原值,以:old_字段名来表示如:old_Custno 。
5.要更改那个表,可以在sql语句中from 表名 来指定。