在一个多用户环境中,大概20+个用户,随时可能读取数据,每一个用户都应该读取到其他用户未访问过的数据,如果某个记录已经被其他用户修改过(有修改位的标志)或正在被某个用户访问,那么其他的用户在读取下一条数据的时候,就不应该得到这些数据,应该继续向下寻找没有被修改过并且不是正在被其他用户访问的数据。要实现以上的功能,有什么好办法吗,最好具体一点,后台数据库是 sql server ,前台是delphi谢谢各位了
解决方案 »
- GetModuleFileName问题,取回的总是不可取的值!高手指点!
- 远程连接sql server ,dbgrid的刷新 问题?
- 求TDatabase连MSDE的方法及代码
- 怎样写触发器?
- 终于、找到了一个放分的理由!
- 用clientDataset.LoadFromStream(x);读如数据,在DBGrid中也能显示,就是不能保存到数据库中??????
- ADOQuery取不到小数点后多于4位的数!如何解决啊?
- 急需delphi编写的dll源码来学习,望高手们指点一二(哪里有好的学习代码下载?)
- 一个声明变量参数的问题,说来回答?
- WIN7下delphi如何检测是否为中文输入法,immisime在win7下失效
- bde和ado哪个好用?
- 求问这种组件(伸缩面板,抽屉面板,窗体拖放融合)? 谢谢
给表加一个标识字段,如果用户访问了某些数据,给这些数据的标识字段设一个已读取标识就好了。比如加一个"HasRead" 字段,为int型,默认为0,标识未读取,如读取后,设为1,读取时,SQL中加入 where HasRead > 0 条件,应该可以了。
因爲要對訪問的記錄作標記,最好在表中增加一個INT型標識字段,初始爲0,每修改一次+1。
“易飛ERP”中每一個表中都有這樣的標識字段。
顺便说一下环境:
操作系统 :win2000
数据库 : sql server2000
前台 :delphi 6
需要处理的记录容量大概在 10W左右,
网络环境 :100M交换环境
我加了一个标识字段,一位字符的,默认值为0,如果用户正在读取这条记录,就把这条记录的标识字段设置为1,其他用户读取数据的时候就读取标识字段为0的。但是有两个用户同时读取到同一条记录的情况,这是万万不能出现的情况。郁闷中。希望大家帮忙想想有什么好办法吗?其实这个问题也是一个比较典型的多用户问题,希望我们能够共同努力想到一个好的解决办法,谢谢了。
一时忘了,给你找找~~
adoconnection1.begintrans;
try
adoconnection1.execute('UpdateSQLsting');//更改读取标识
adoquery1.recordset:=adoconnection1.execute('SearchSQLstring');//打开读取
adoconnection1.committrans;
except
adoconnetion1.rollbacktrans;
end;
其他事务都得等待~~
sqlstr,mytel,mydate:string;
begin
sqlstr:='select top 1* from table1 where his=0 and reader=0';//两个条件都符合时查询记录
adoquery1.Recordset:=adoconnection1.Execute(sqlstr);
mydate:=datetimetostr(now);//访问时间
mytel:=adoquery1.FieldByName('tel').AsString;
if mytel='' then//表示记录为空时中断本次操作
abort;
adoconnection1.BeginTrans;
try
adoconnection1.Execute(sqlstr);
sqlstr:='update table1 set reader=1 where tel='''+mytel+'''';//置有人访问状态
adoconnection1.execute(sqlstr);
//这里可以插入其他操作
//操作完毕
//置访问过的时间和状态
sqlstr:='update table1 set isdate='''+mydate+''',his=''1'',reader=''0'' where tel='''+mytel+'''';
adoconnection1.Execute(sqlstr);
adoconnection1.CommitTrans;
except
adoconnection1.RollbackTrans;
end;
end;
//以上的his字段实际上可以不要,那么his=0就可以用isnull(isdate,0)=0替代
//另外,isdate是SQL 里的一个函数,如果你用这个做为字段名会有错误隐患,建议更改
//代码本身无错误,但没有做大量数据测试
//建议将代码做成一个过程,放在客户的触发事件
每条记录都有一个唯一性标记,先SELECT 无标记的,记下标记字段
UPDATE你的读取标记字段
读取记下的标记字段对应的数据