adoquery的查询语句像
     select a=2,auditor from d_scl 
之后在界面中想修改 a 这一列就是死活不让改,包括把列a的readonly属性改
成false。如果不考虑把a的fieldkind属性改成calculated(不想这样),不使用
临时表,不用clientdataset,单单设置adoquery可以作到吗?

解决方案 »

  1.   


    从DBGrid第一行开始依次读取a的值,循环运行SQL命令procedure Proc;
    var
      mySql: string;
      i: Integer;
    begin
      for i := 0 to DBGrid.count - 1 do
      begin
        mySql := ' Update d_scl set a = ''' + 显示值 + ''' + ' where ' + 条件;
        with ADOQuery do
        begin
          Close; SQL.Clear;
          SQL.Text := mySql;
          ExecSql; 
        end;
      end;
    end;
      

  2.   

    其实列a的数值在所有的表中是找不到的,数据集是从存储过程返回的。得到这个数据集后,点窗口上的按钮,计算出每一行的列a的值,再根据列a判断出要保存到一个表的列b的值,用户再点保存按钮将列b的值更新到表里面去。其实我可以把列a也建在表里,作为冗余的列(因为它可以计算出来),但是又不想这样做。我是想弄明白为什么列a在adoquery里面不是
    readonly的,是什么地方使他不能更新(在代码里面Post时报列a不能更新,dbgrid里面它死硬都要改回原来SQL里面给它的值 2)
      

  3.   

    我现在发现在存储过程中经过计算过的字段都不能改值,改用其它数据库控件也是,真的没法改吗,其实adoquery的
    locktype是ltBatchOptimistic的,所有改过的记录在没有updatebatch之前都是在用户的内存的,为什么delphi
    不让改内存里的数据
      

  4.   

    如果可以改我不就可以考虑不用clientdataset 控件了吗
      

  5.   

    我对windows消息处理不熟,知道DLL中创建的窗体的句柄,有什么办法可以让主窗体在退出时可以完全释放DLL中调用的窗体后再关掉自己(因为DLL中有数据库连接),我用postmessage依然报错,用sendmessage是发现DLL中的窗体是关了,但是主窗体不关,在sendmessage之后有一句showmessage('aaa')发现就可以了,但是总不能让用户在关闭程序时还要再关闭一下弹出窗口吧,用sleep(1000)发现跟没用一样,请问这个问题怎么解决,谢谢
      

  6.   

    那位先说说在主窗体的onclose事件中先sendmessage(h,mw_close,0,0)再action=cafree为什么可以关掉DLL中的窗体但是主窗体不关闭,谢谢