我有一个三层结构程序,服务端有一个函数:函数返回表A(字段AA)的值的相应记录的值!我在一台机子(P1)上修改了表A(字段AA)的一条记录后,通过调用服务端那个函数可以看到数据已经改变了.但是在另一台机子(P2)上调用服务端函数却没有看到数据修改!!并且进入sqlplus也看不到数据修改!但是退出P1后,P2上就可以看到数据修改了! 这是为什么??????????
真是奇怪!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
真是奇怪!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
解决方案 »
- 怎样判断数据是否是boolean类型
- 关于窗口在任务蓝显示的问题。
- 谁给我交换delphibbs.com的分呀?
- 能不能从一串字符,如‘105毫米’中只取出数字‘105’?
- 请问如下代码要如何实现,主要是OPENDIALOG的特性
- TClientDataset数据刷新的问题,提出有建设性建议的有分
- 一个读文件的问题
- 用WebSnap开发网络应用,处理数据连接的问题
- 求一个算法:两个字符串,包含的字符一样,就是顺序不一样,怎样认为是一个字符串呢?
- 数据库表头及索引坏了,!
- 谈谈MS SQL 2000、Sybase SQL、ORACLED三种数据库各有什么优缺点?
- 关于消息机制,快来接分吧。守信用...
我的服务端是通过动态TQuery进行读取的,用完之后free掉了.
客户端是通过设置ClientDataSet的commandtext执行update进行修改的,所用到的ClientDataSet也是用完就close了!请高手救命啊!
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;
ado就没有这种问题
bde有一个缓存功能,好象可以关掉,不过我没用过bde,你自己找找看
Query1:= TQuery.Create(nil);
Query1.DatabaseName:= 'ZFGLDB';//databasename;
Query1.SessionName:=Session.SessionName;是不是加上一句Query1.CachedUpdates:= false;就行了?
还是要其它处理!
就是Query1.CachedUpdates:= false;这一句的问题!!!!!!!!!!!(mmd)
放分结帐!