各位, 我想遍历一个表里的所有条目, 然后修改一下其中几个列的值, 代码如下:procedure TForm1.Button10Click(Sender: TObject);
begin
  SQLDataSet1.CommandType := ctQuery;
  SQLDataSet1.CommandText := 'SELECT * FROM students';
  SQLDataSet1.ExecSQL();  SQLDataSet1.Open;
  SQLDataSet1.First;
  while not SQLDataSet1.Eof do
  begin
    SQLDataSet2.CommandType := ctQuery;
    SQLDataSet2.CommandText := 'UPDATE students set name = (:name) where ID = (:id);';    SQLDataSet2.Params.ParamByName('name').AsString := trim(SQLDataSet1.FieldByName('name').AsString);    SQLDataSet2.ExecSQL;
    SQLDataSet1.Next;
    Application.ProcessMessages;
  end;
  SQLDataSet1.Close;
end;
似乎是SQLDataSet1没close之前, SQLDataSet2操作同一个表去修改数据, 会造成堵塞, 反应非常慢.请问一下改怎么解决. 谢谢.

解决方案 »

  1.   

    试试这样:用TClientDataSet,先把'SELECT * FROM students'取到本地,再在此本地数据集中进行遍历和执行更新。
      

  2.   

    dbExpress的TSQLDataSet是一种"unidirectional“数据集,即在遍历完所有记录后,它并不保存本地记录缓冲,换句话说,不能直接修改该数据集记录。但在未遍历完所有记录之前,它对背后的数据库表是某种锁定的状态,这时候再对该锁定的表记录进行更改,可能这时候,dbExpress的内部机制会重新生成针对当前TSQLDataSet生成新的结果集并继续进行fetch,这样导致的结果,就是反映速度慢了。你的事实证明这样做,从目前来看是可以的(没有数据更新错误)。