如题:
  数据表table1,其关键字字段为ID1,用线程向里面添加记录,线程exe方法为:procedure mythread.Execute;
var
  adods:TADODataSet;
begin
  { Place thread code here }  Coinitialize(nil);  try
  adods:=TADODataSet.Create(nil);
  adods.Connection:=Form1.ADOConn;
  adods.Close;adods.CommandText:='select * from table1';
  adods.Open;
  adods.Append;
  adods.FieldByName('ID1').Asinteger:=get_id('table1','ID1')+1;//注意这里get_id函数是取表里最大的ID1,然后加1作为新的关键字的值存入
  adods.FieldByName('abc').AsString:='aaa';
  adods.Post;   
  finally
  FreeAndNil(adods);
  end;  CoUninitialize;
end;如果开多个线程的话,就会出现关键字重复的问题,即保存的时候关键字不唯一,怎样解决这种问题呢???

解决方案 »

  1.   

    1:多线程你不应该公用一个connection,而应该每个线程分配一个connection
    2:你应该使用自增字段
      

  2.   

    自增字段下,多个connec我试过,可以的,可是如果不是自增情况,按上面的情况怎么办呢?
      

  3.   

    get_id 的时候,另一个也在 get_id 。所以这个资源是“共享”的。
    用“锁”Lock一下。
      

  4.   

    对Post做异常保护,如果出现关键字重复的话,就做重取get_ID操作,再post,一直到能post进去为止。
      

  5.   

    用临界区: 
    var   cs:TRTLCriticalSection; //定义全局变量
    ... 
    InitializeCriticalSection(cs);//程序开启创建 
    ... 
    EnterCriticalSection(cs);//进入临界区 
    adods.Append;
      adods.FieldByName('ID1').Asinteger:=get_id('table1','ID1')+1;//注意这里get_id函数是取表里最大的ID1,然后加1作为新的关键字的值存入
      adods.FieldByName('abc').AsString:='aaa';
      adods.Post; 
    LeaveCriticalSection(cs);//临界区结束 
    ... 
    DeleteCriticalSection(cs); //程序结束关闭
      

  6.   

    还有 你这添加记录  完全可以用SQL执行。例:
    adoqurey1.sql.text := 'insert into table1 (ID1,abc) values(1,''aaa'') '
    adoqurey1.ExecSQL;