多用户向一个表中插数据时,出错!请帮帮我!100分(100分)

  • 主题发起人 主题发起人 江江
  • 开始时间 开始时间

江江

Unregistered / Unconfirmed
GUEST, unregistred user!
在我做的c/s系统中,有两个以上的用户相同一个表中增加记录,只要其中的一个增加记录后
保存或取消,那么另一个用户点击[新增]时就出错!
出错代码如下:
couldn't perform the edit because another user changed the record!
 
你用什么控件操作表?是否使用CACHE UPDATE?
 
不是的用table控件
 
数据刷新,更新前刷新数据或出错后cancel当前记录的更改再刷新,再要求用户在新记录下
进行更改,或者采用仅关键字匹配方式更新记录
 
shijunwu:
对不起啊,我没看懂,我刚才在[新增]的代码前加了将这个表关闭再打开的代码.在cancel后
也加了refresh,可是它还报错,气死我了!!!
 
table.open;
table.refresh
。。。。
table.post;
table.refresh

 
不要用table
改用query+updatesql
 
我已经这样写了,可是还是出错!错误代码相同
另外我发现,进行table.edit,以后[保存]则另一个用户新增记录时不报错,好奇怪!
 
情况紧急,大概来不及换成query了,有没有别的办法?
 
不要用refresh.用requery但当前记录指针有变化
 
to shijunwu:
说的是 TADOTable 吧, 请问 TTable的 requery 在哪?
 
我的解决方案:

经由不同的数据库连接向TTable中插入记录时,两次操作间必须有几秒的延时,否则就会
发生错误。
请看下列程序,这是一个被多个线程(每个线程有自己的数据库连接)使用的,用TTable向一个表中
插入记录的程序:

function TRWTableDBTOpr.Add(Value: Pointer): Word;
const
LastOprDB : Pointer = nil;
LastOprTable: string = '';
LastOprTime : TDateTime = 0;
begin
if DynamicOpenTable(DBObject) then
begin
EnterCriticalSection(FCritical);
{由于BDE不具备多线程安全性,故需要对不同链接对同一表的插入操作加入延时}
while (LastOprDB <> DBObject.Database) and
(LastOprTable = TTable(DBObject).TableName) and
(Now - LastOprTime < 0.0005) do
Beep;
LastOprTime := Now;{首先刷新操作时间,以增加安全性}
LastOprDB := DBObject.Database;
LastOprTable := TTable(DBObject).TableName;
DBObject.Insert;
try
SetRecord(Value);
DBObject.Post;
Result := msgSucceed;
except
DBObject.Cancel;
Result := msgInsertFail;{增加记录失败}
end;
LastOprTime := Now;{记录最近的时间,前面虽然记录了一次,但其参考价值已打折扣}
LeaveCriticalSection(FCritical);
end
else
Result := msgDontUsedObject;{不可用的数据库对象}
end;

贴主的情况稍有不同,但道理是一样的,即:在经由不同的数据库连接,用TTable向同一表
插入记录时,两次操作之间必须有适当的延时。
 
谢谢各位,我后来发现'前人'在该表的afterpost事件中写了更改记录的代码,我将其删除并将
功能添加到按钮中就解决了.
 
后退
顶部