哪位仁兄能回答这个问题:
Delphi下的BDE中的UpdateSql的用法?
小弟在学习bde数据库编程时不知道UpdateSql的用法,和其一般在哪些地方使用。
请诸位高谈阔论...

解决方案 »

  1.   

    加一個控件UP:TQuery,設定databaseName,
    UP.SQl.Text :='update XXX.db set 字段=... where ...
    UP.ExecSQL;
      

  2.   

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

  3.   

    yesxwl() 兄:能不能给个例子:
    看懂了就给分
      

  4.   

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

  5.   

    因为主要是设置属性,源码很简单和普通的一样.操作步骤:
    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;
      

  6.   

    yesxwl() 兄:你给的例子:
    第二步:
     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;  Updatesql1控件:
        选择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 
    问题
    1:设置Query1属性:
          SQL语句中customer和order是不是主细表关系;通过custno外关键字联系?
         要不要设置主细表关系呀?customer是主表,order是细表
         就是说:Updatesql1控件:是用于主细表的场合,通过主表去更改子表呀?
    2:Updatesql1控件:
         Modify :
         sql语句中以上参数,字段没有赋值呀,也就是说它们是通过什么赋值的?3.query1中sql是要显示custno,order中所有字段在TDBGRidk中,
      为什么要显示两个表的数据呢,而不显示其中一个表呢?4.你的update customer部分
        set
          CustNo = :CustNo,

    where部分
          CustNo = :OLD_CustNo 
    怎么理解
    5,Updatesql1控件:是更改custom表呀,只是一个表;为什呢?可联系1.问讲讲呀以上也许是我不懂,问得互相矛盾,你可以细细讲述,不够分再另加100给你。谢谢
      

  7.   

    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 表名 来指定。
    不知我说得是否能让你明白?
      

  8.   

    大概晓得了,
    4。中的where部分中的custno=:custno是custom表中的主关键字是吗?
    where中通常写入是要修改的表的主关键字是吗?
      

  9.   

    所有字段都可以进行修改,只是利用主关键字来定位唯一的记录.如果没有主关键字就需要个字段组合起来定位直至所有字段,如:where custno=:Old_custNo and company=:old_company and ……
      

  10.   

    Updatesql1控件:
        选择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 
    还有一点不懂呀:
    如上:
    Updatesql1控件:中参数要赋值,在哪里进行赋值呢?
    (哪个dataset中:table? or query? orUpdatesql中? )
    Updatesql1控件中sql语句是事先写的呀???
    是不是在qurey or table 的post方法前
    用FieldByName('...').asstring之类语句赋值呢?
      

  11.   

    程序在运行时,当以数据集进行确认更新时(Post),updatesql自动根据你对选择的数据集(如: query)的修改(modify,insert,delte)进行判断,选择相应的sql语句,并将你修改的数据(保存在缓冲中)自动赋值给参数.然后执行sql语句.
    你对数据的修改其实都保存在缓冲中,BDE都赋予了名字,如原值用oldvalue,新值NewValue等,宁关就能将这些值与updatesql中的参数一一对应,不需要用户干涉.
      

  12.   

    也就是说UpdateSql控件中的sql语句是不用自己赋值的是吧?thank you 
    顺便问一下你是用Delphi6.0吧?用D6+bde+什么大型数据库呀?
      

  13.   

    是的,不用自己赋值
    以前用d6,现在d7+bde+sql server 2k
      

  14.   

    bde与sql server2000有冲突呀。bde只支持db_library,microsoft已不支持此库更新。你是怎么用的。
      

  15.   

    yesxwl() 兄:t谢谢你呀,我还有一个问题你可以参与呀:
    关于database的事务问题我会放贴子