书上说UPDATESQL可以对只读数据进行修改,我现在要对一个QUERY进行修改,QUERY 中的SQL STRING 是对主从两张表的查询,请问,是否可通过此控件对其数据修改

解决方案 »

  1.   

    参见我的回答
    http://expert.csdn.net/Expert/topic/2018/2018919.xml?temp=.6985132
      

  2.   

    TQuery和UpdateSQL相连,设置CachUpdates为True,然后指定SQL语句,updateSql的作用就是用缓存,修改后不是马上更新到数据库中的,一定要用ApplyUpdates才会存入库中,用post他还在缓存中,
      

  3.   

    可不可以用一个具体的例子呢?Query.sql.text是一个多表查询,主从关系,用代码告诉我如何寻其增删改(UpdateSql)
      

  4.   

    你没看吗?里面有例子
    http://expert.csdn.net/Expert/topic/2018/2018919.xml?temp=.6985132
      

  5.   

    把一个UPDATESQL控件放在datamodel里面,然后让query的updatevobject指向
    该updatesql,然后双击该控件,选定你的表格的key字段, 和要更新的字段,
    然后再按genertesql按钮,一切大功搞成。
    还有你的query控件的cachupdate属性要设为 
    true,然后你就只需要在更新的时候用applyupdates 举一个简单的例子: 
    假如dbo.table1(id,name) 
    query1的sql为: 
    select id,name from table1 把query1的CacheUpdates = True,RequestLive 设成 false, 
    UpdaeObject=updatesql1, query1的afterpost为: 
    with Query1 do 
     begin 
     Database1.StartTransaction; 
       try 
         ApplyUpdates; 
         Database1.Commit; 
       except 
         Database1.Rollback; 
       raise; 
       end; 
     CommitUpdates; 
     end; updatesql1的modify为: 
    update table1 
     set name=:name 
    where id=:id 现在 
    query1.edit; 
    query1.fieldbyname('name').asStrign:='a'; 
    query1.post; 
      

  6.   

    给你个例子吧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;
      

  7.   

    当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;//该数据集即为只读