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';