procedure TForm1.Button1Click(Sender: TObject);
var
    I: Integer;
    ADOQ: TADOQUERY;
begin
    ADOQ := TADOQUERY.Create(SELF);
      if IsInputNil then begin
        Application.MessageBox('记录添加失败!合同编号不能为空!请修改合同编号!',
            '出错信息!', MB_ICONERROR);
        DBEdit1.SetFocus;
        Exit;
    end;
    if ExtRec then begin
            Application.MessageBox('记录添加失败,记录已存在!请修改合同编号!',
                '出错!', MB_ICONERROR);
            Edit1.SetFocus;
            Exit
            end
        else begin
        if DBEdit1.Text <> sOldID then begin
            if ExtRec then begin
                Application.MessageBox('记录修改失败,记录已存在!请修改合同编号!',
                    '出错信息', MB_ICONERROR);
                Edit1.SetFocus;
                Exit;
            end;
        end;
    with ADOQ do begin
        CONNECTION := unit2.DataModule2.ADOConnection1;
        unit2.DataModule2.ADOConnection1.BeginTrans;
             try
            for I := sTablename.Count - 1 downto 0 do begin
                if sTablename[i] = 'TID' then Continue;                SQL.Text := 'INSERT into ' + sTablename[i] +
                    ' (hetong) values (''' + Edit1.text + ''')';                ExecSQL;            end;
            unit2.DataModule2.ADOConnection1.CommitTrans;//Commits an open transaction.
            except
            unit2.DataModule2.ADOConnection1.RollbackTrans;//Rolls back an active transaction
为什么要try....except 去掉它为什么不行

解决方案 »

  1.   

    var stablename:stringlist 
    for I := sTablename.Count - 1 downto 0 do begin
                    if sTablename[i] = 'TID' then Continue;
    什么意思
      

  2.   

    做循环处理,循环CDS的所有字段,判断字段是否为“TID”
    Try Except 是做异常处理,
    如果正常执行

    Try
    执行SQL语句
      showmessage('成功');
    exept
      showmessage('不成功');
      exit;
    end;
      

  3.   

    给你错误运行的步骤,否则程序是不灵活的
    try
      ... // 正常执行
    except
      ... // 出现异常后执行
    end;还有一种
    try
      ... //正常执行
    finally
      ... // 不管上面出现什么情况,完成后都将执行这一行语句
    end;
      

  4.   

    去掉了怎么做异常处理?这样的程序应该说更健壮一些。如果插入不成功就回滚数据库,可以保证数据库内容的正确性,不至于发生严重错误。
    为什么要去掉那,留着多好!!严重同意。另外,代码似乎还有值得修改的地方,如下with ADOQ do begin
            CONNECTION := unit2.DataModule2.ADOConnection1;
            unit2.DataModule2.ADOConnection1.BeginTrans;
                 try
                for I := sTablename.Count - 1 downto 0 do begin
                    if sTablename[i] = 'TID' then Continue;                SQL.Text := 'INSERT into ' + sTablename[i] +
                        ' (hetong) values (''' + Edit1.text + ''')';                ExecSQL;            end;
                unit2.DataModule2.ADOConnection1.CommitTrans;//Commits an open transaction.
                except
                unit2.DataModule2.ADOConnection1.RollbackTrans;//Rolls back an active transaction
    我的意见是改成以下的代码:        CONNECTION := unit2.DataModule2.ADOConnection1;
            try
              if unit2.DataModule2.ADOConnection1.InTraction = true then
              begin
                unit2.DataModule2.ADOConnection1.CommitTraction;
                unit2.DataModule2.ADOConnection1.BeginTraction;
              end
              else
                unit2.DataModule2.ADOConnection1.BeginTractioin;
              with ADOQ do 
              begin
                for I := sTablename.Count - 1 downto 0 do 
                begin
                  if sTablename[i] = 'TID' then Continue;
                  SQL.Text := 'INSERT into ' + sTablename[i] +
                        ' (hetong) values (''' + Edit1.text + ''')';              ExecSQL;
                end;
                unit2.DataModule2.ADOConnection1.CommitTrans;//Commits an open transaction.
              end;
            except
              on EdataBaseError do
                unit2.DataModule2.ADOConnection1.RollbackTrans;//Rolls back an active transaction
            end;
    大致是这样