我有一个三层结构程序,服务端有一个函数:函数返回表A(字段AA)的值的相应记录的值!我在一台机子(P1)上修改了表A(字段AA)的一条记录后,通过调用服务端那个函数可以看到数据已经改变了.但是在另一台机子(P2)上调用服务端函数却没有看到数据修改!!并且进入sqlplus也看不到数据修改!但是退出P1后,P2上就可以看到数据修改了! 这是为什么??????????
真是奇怪!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

解决方案 »

  1.   

    我想这是因为锁表的原因吧.(但我不知道是什么原因?)
    我的服务端是通过动态TQuery进行读取的,用完之后free掉了.
    客户端是通过设置ClientDataSet的commandtext执行update进行修改的,所用到的ClientDataSet也是用完就close了!请高手救命啊!
      

  2.   

    现将函数贴上. 望大侠们治病救人!!
    procedure TFGDataMod.RemoteDataModuleDestroy(Sender: TObject);
    begin
    Database.Connected:=false;
    end;function TFGDataMod.GetUsersPrivilege(const uid,
      pno: WideString): OleVariant;
    function binadd(str1,str2:string):string;
      var  //返回二个字符串进行"或"运算之后的结果字符串
        i,j,count1,count2,count:integer;
        t1,t2,rtn:string;
      begin
        count1:= length(str1);
        count2:= length(str2);
        if Count2> count1 then count:= count2 else count:= count1;
        for i := 0 to count -1 do
        begin
            if i<count1 then t1:= copy(str1,i+1,1) else t1:='0';
            if i<count2 then t2:= Copy(str2,i+1,1) else t2:='0';
            j:= StrToInt(t1)+StrToInt(t2);
            if j>=1 then rtn:= rtn+ '1' else rtn:= rtn+ '0';
        end;
        Binadd:= rtn;
      end;var
        Query,Query1: TQuery;
        lcount:integer;
        priv,fun,tt:string;
        role:integer;
    begin
        //判断是否存在该用户
        Query:=TQuery.Create(nil);
        Query.DatabaseName:='ZFGLDB';
        Query.SessionName:=Session.SessionName;
        Query.SQL.text:='select count(*) count from um_user where user_id ='''+uid+'''';
        Query.Open;
        lcount := Query.FieldValues['count'];
        if lcount<=0 then
        begin
            Query.Close;
            Query.Free;
            priv:= ';';
            GetUsersPrivilege:= Priv;
            exit;   //如果不存在该用户返回false
        end;
        //得到该用户的角色
        priv:= '';
        fun:='';
        with Query do
        begin
           Query1:= TQuery.Create(nil);
           Query1.DatabaseName:= 'ZFGLDB';//databasename;
           Query1.SessionName:=Session.SessionName;
           if Active then Close;
           sql.clear;
           Sql.Add('select role_no from um_userrole where user_id =:uid ');
           params[0].asstring:= uid;
           open;
           First;
           while not eof do
           begin
                //得到该用户的角色
                role:= Fields.Fields[0].asInteger;
                if Query1.Active then Query1.Active:= false;
                Query1.SQL.text:= 'select privilege_string,objfun from um_rolePriv_set where role_no=:rno and Privilege_no=:pno';
                Query1.params[0].asInteger:=role;
                Query1.Params[1].asstring:=pno;
                Query1.Open;
                Priv:= Binadd(Priv,Query1.FieldByName('privilege_string').asstring);
                tt:= Query1.FieldByName('objfun').asstring;
                if fun='2' then else if length(tt)<>0 then fun:=tt;
                next;
           end;
            if Active then Close;
            Sql.Clear;
            sql.add('select PRIVILEGE_STRING,OBJFUN from um_UserPRIV_SET where user_id=:uid and PRIVILEGE_NO=:pno');
        params[0].asstring:= uid;
         params[1].asstring:= pno;
         open;
         Priv:= Binadd(priv,Fields.fields[0].asstring);
            tt:= Fields.Fields[1].asstring;
            if fun='2' then else if length(tt)<>0 then fun:=tt;
            Query1.Close;
            Query1.Free;
         end;
        Query.Close;
        Query.Free;
        priv:= fun+';'+priv;
        GetUsersPrivilege:= Priv;  
    end;
      

  3.   

    就是啊,你的数据还是在本地缓存啊,服务器当然不知道了,你用ado好不好
    ado就没有这种问题
    bde有一个缓存功能,好象可以关掉,不过我没用过bde,你自己找找看
      

  4.   

    跟线程没有关系吧. 我的其它form都正常的很!请问应该怎样将缓存提交到服务器呢?(它本身就是应用服务器函数,而且Query都free掉了呀.怎么会不更新呢?)
      

  5.   


           Query1:= TQuery.Create(nil);
           Query1.DatabaseName:= 'ZFGLDB';//databasename;
           Query1.SessionName:=Session.SessionName;是不是加上一句Query1.CachedUpdates:= false;就行了?
    还是要其它处理!
      

  6.   

    好了.搞定了. 谢谢各位啦. 
    就是Query1.CachedUpdates:= false;这一句的问题!!!!!!!!!!!(mmd)
    放分结帐!