我的解决方案:
经由不同的数据库连接向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向同一表
插入记录时,两次操作之间必须有适当的延时。