但是去除了事务直接写却可以提交全部的数据。

解决方案 »

  1.   

    begin
    if (clientdataset1.State = dsedit) then
    clientdataset1.Post ;
    try
    datamodule1.adoconnection1.BeginTrans  ;
    clientdataset1.First ;
    while not clientdataset1.Eof do  {把在CLIENTDATASE1中的所有数据都添加到RK的表中。}
    begin
    with datamodule1.adoQuery1 do
    begin
    close;
    sql.Clear ;
    sql.add('insert jihuabiao(xuhao,bianhao,tuhao,mingcheng,shuliang,jindu,moxingchang,zhuzaochang,leixing,linghao,jihuabeizhu)');
    sql.add('values(:xuhao,:bianhao,:tuhao,:mingcheng,:shuliang,:jindu,:moxingchang,:zhuzaochang,:leixing,:linghao,:jihuabeizhu)');
    Parameters.ParamByName('xuhao').Value :=jhxuhao;
    Parameters.parambyname('bianhao').Value :=edit1.text;
    Parameters.parambyname('tuhao').Value :=clientdataset1.fieldbyname('tuhao').AsString ;
    Parameters.parambyname('mingcheng').Value :=clientdataset1.fieldbyname('mingcheng').AsString ;
    Parameters.parambyname('shuliang').Value :=clientdataset1.fieldbyname('shuliang').Asfloat;
    Parameters.parambyname('jindu').Value :=clientdataset1.fieldbyname('jindu').Asdatetime ;
    Parameters.parambyname('moxingchang').Value :=clientdataset1.fieldbyname('moxingchang').AsString ;
    Parameters.parambyname('zhuzaochang').Value :=clientdataset1.fieldbyname('zhuzaochang').AsString ;
    Parameters.parambyname('leixing').Value :=clientdataset1.fieldbyname('leixing').AsString ;
    Parameters.parambyname('linghao').Value :=clientdataset1.fieldbyname('linghao').AsString ;
    Parameters.parambyname('jihuabeizhu').Value :=clientdataset1.fieldbyname('beizhu').AsString ;execsql;
    end;
    clientdataset1.Next ;
    end;
    datamodule1.ADOConnection1.CommitTrans  ;
    clientdataset1.enablecontrols;
    except
    if datamodule1.ADOConnection1.InTransaction then
    datamodule1.adoconnection1.RollbackTrans ;
    showmessage('错误,请检查输入是否正确');
    clientdataset1.enablecontrols;
    end;
    end;
      

  2.   

    楼主把事务提交放到了循环语局的外边,这个事务就不怎么起作用了,
    因每一行都执行了一次execsql,到了最后一条才退出循环,然后
    CommitTrans  提交事务,很明显这个事件只对最后一个execsql起作用;
    估计这就是你问了为什么的原因,把你的事务处理放到while的里边试试吧
      

  3.   

    如果把事务的开始放到WHILE中,达不到预期的要求,我想是把所有的临时表中的数据都添加到SQLSERVER中,有错误全部回滚的。如果添加到WHILE 中那么只对应的是一条纪录而已。
    再一个事务中只能有一个EXECSQL吗,我记得以前使用BDE时,可以执行多个EXECSQL的。
    这次我是第一次使用ADO。代码也是以前BDE中的。在BDE中应该是可以的呀