var
  ADOQ: TADOQuery;
  pFIBDatabase1: TpFIBDatabase;
  pFIBTransaction1, pFIBTransaction2: TpFIBTransaction;
  pFIBDataSet1: TpFIBDataSet;
  I: integer;
  FContent, FSolution: TStream;
begin
 ADOQ:= TADOQuery.Create(nil);
 ADOQ.ConnectionString:=
  format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False',[Fmdbfile]);
 ADOQ.SQL.Text:= 'select * from tbtopic';
 ADOQ.Open;

 pFIBDatabase1:= TpFIBDatabase.Create(nil);
 pFIBTransaction1:= TpFIBTransaction.Create(nil);
 pFIBTransaction2:= TpFIBTransaction.Create(nil);
 pFIBDataSet1:= TpFIBDataSet.Create(nil);

 pFIBTransaction1.TRParams.Add('read');
 pFIBTransaction1.TRParams.Add('nowait');
 pFIBTransaction1.TRParams.Add('rec_version');
 pFIBTransaction1.TRParams.Add('read_committed');

 pFIBTransaction2.TRParams.Add('write');
 pFIBTransaction2.TRParams.Add('nowait');
 pFIBTransaction2.TRParams.Add('concurrency');

 pFIBDatabase1.DefaultTransaction:= pFIBTransaction1;
 pFIBDatabase1.DefaultUpdateTransaction:= pFIBTransaction2;

 pFIBDatabase1.DBName:= Ffdbfile;
 pFIBDatabase1.ConnectParams.UserName:= 'sysdba';
 pFIBDatabase1.ConnectParams.Password:= 'masterkey';
 pFIBDatabase1.ConnectParams.CharSet:= 'gb18030';
 pFIBDatabase1.SQLDialect:= 3;
 pFIBDatabase1.LibraryName:= 'fbclient.dll';
 pFIBDatabase1.Connected:= true;
 //pFIBDatabase1.ReadOnly;

 pFIBDataSet1.Database:= pFIBDatabase1;
 pFIBDataSet1.AutoCommit:= true;
 pFIBDataSet1.AutoUpdateOptions.AutoReWriteSqls:= True;
 pFIBDataSet1.AutoUpdateOptions.CanChangeSQLs:= True;
 pFIBDataSet1.AutoUpdateOptions.UpdateOnlyModifiedFields:= True;
 pFIBDataSet1.AutoUpdateOptions.UpdateTableName:= 'tbtopic';
 pFIBDataSet1.AutoUpdateOptions.KeyFieldList.Add('CODETOPIC');
 pFIBDataSet1.SelectSQL.Text:='select * from tbtopic';
 pFIBDataSet1.Conditions.Clear;
 pFIBDataSet1.Conditions.AddCondition('1<>1', '1=2', true);//返回空表
 pFIBDataSet1.ApplyConditions(true);

 try
  TForm9(FForm).btn5.Enabled:= False;
  FCount:= ADOQ.RecordCount;
  for I:= 0 to FCount - 1 do
  begin
   FCurID:= I+1;
   Synchronize(ShowProcess);
   pFIBDataSet1.Append;         //出现错误‘Cannot modify a read-only dataset’
   pFIBDataSet1.FieldByName('codetopic').AsString:= ADOQ.FieldByName('code').AsString;
   pFIBDataSet1.post;
   ADOQ.next;
  end;
 finally
  ADOQ.close;
  ADOQ.free;
  pFIBDatabase1.CloseDataSets;
  pFIBDatabase1.Close;
  pFIBDataSet1.free;
  pFIBTransaction1.Free;
  pFIBTransaction2.Free;
  pFIBDatabase1.free;
  TForm9(FForm).btn5.Enabled:= True;
 end;

解决:

BDataSet1.AutoUpdateOptions.UpdateTableName:=
'tbtopic'; 
//改成大写就好了,不知道为啥。
BDataSet1.AutoUpdateOptions.UpdateTableName:=
'TBTOPIC';
 

posted on 2011-03-14 23:09  fyen  阅读(1018)  评论(0编辑  收藏  举报