大哥哥大姐姐,救命呀
从提示来看:不能在已关闭的数据库上执行操作
但是我可以肯定数据库当时已经打开
唯一不敢肯定的就是下面这个事务提交,代码如下:
procedure TForm1.cxButton3Click(Sender: TObject);
var
  SqlString:String;
begin
  SqlString:='update billaid set deptid=desk.deptid,cfnid=desk.cfnid from billaid,desk where ( billaid.deskid = desk.deskid ) and ( ( billaid.billkindid = '+'''0403'''+' ) ) )';
  with Query1 do
  begin
    if not Database1.InTransaction then
    begin
      Database1.StartTransaction;
    try
      Close;
      Sql.Clear;
      Sql.Add(SqlString);
      ExecSQL;
      Database1.Commit;
    except
      Database1.Rollback;
      ShowMessage('数据提交失败');
    end;
    CommitUpdates;
    end;  end;end;
如果我不用事务提交,直接
Close;
Sql.Clear;
Sql.Add(SqlString);
ExecSQL;
程序通过,我怀疑我事务提交有问题,是不是?????????????????还有,我在delphibbs看有些网友讨论事务提交的数量,提出比较少的数据可以,如果数据量大的时候事务提交只是理论上行的通,速度受不了,是吗?
那如果一天的销售数据有10W条,我晚上进行汇总的时候要进行各种关联表的操作,数据量也很大,那不用事务提交用什么喃??????????

解决方案 »

  1.   

    错误应该在这一句:Database1.StartTransaction; 表示你的数据库没有打开,仔细检查一下什么地方是否关闭或者压根从来就没有打开过。在Database1.StartTransaction;前也可加上Database1.Close;Database1.Open;
      

  2.   

    我能确保我的Database1.Connected:=True;
    还有我的Query1.CatchUpdates:=True;
    我还有什么地方没对,我无语了。
    还有第2个问题谁知道???????????
      

  3.   

    换成这样行吗?
    procedure TForm1.cxButton3Click(Sender: TObject);
    var
      SqlString:String;
    begin
      SqlString:='update billaid set deptid=desk.deptid,cfnid=desk.cfnid 
           from billaid,desk where ( billaid.deskid = desk.deskid ) and
           ( ( billaid.billkindid = '+'''0403'''+' ) ) )';
      Close;
      Sql.Clear;
      Sql.Add(SqlString);
      with Query1 do
      begin
        if not Database1.InTransaction then
        begin
          Database1.StartTransaction;
        try
          ExecSQL;
          Database1.Commit;
        except
          Database1.Rollback;
          ShowMessage('数据提交失败');
        end;
        CommitUpdates;
        end;
      end;
    end;
      

  4.   

    前面的Close;SQl.Clear;SQL.Add(SqlString)前加上"Query1."
      

  5.   

    也不行,我这里有源码www.china-aroma.com/tiaozheng.rar
    能用demo库给我演示哈正确的也行呀
      

  6.   

    我的事务是这样做的,楼主看看吧
       DB_Link.ADOC_DBLink.BeginTrans ;  ////ADOC_DBLink 为AdoConnection控件
             try
                begin
                  DB_Link.ADOC_DBLink.CommitTrans ;
             
                end;
            except
               DB_Link.ADOC_DBLink.RollbackTrans  ;
               Screen.Cursor:=crDefault;
               AdoQ_base.EnableControls;
               Application.MessageBox('基站信息统计表导入失败,',PChar(self.Caption), MB_OK + MB_ICONSTOP);
            end;
      

  7.   

    我用的bde,况且我认为我写的事务提交看上去没有明显错误呀
      

  8.   

    procedure TForm1.cxButton3Click(Sender: TObject);
    var
      SqlString:String;
    begin
      SqlString:='update billaid set deptid=desk.deptid,cfnid=desk.cfnid from billaid,desk   where ( billaid.deskid = desk.deskid ) and ( ( billaid.billkindid = '+'''0403'''+' ) ) )';
      if not Database1.InTransaction then
        Database1.StartTransaction;
      try
        with Query1 do
        begin
          Close;
          Sql.Clear;
          Sql.Add(SqlString);
          ExecSQL;
        end;
      except
        Database1.Rollback;
        ShowMessage('数据提交失败');
        raise;
      end;
      Database1.Commit;
     end;end;试试看
      

  9.   

    chenren70() 你哪个提交不该在try...except后面吧,问题依旧,倒,弄死没有相通怎么回事情
    我这里有源码www.china-aroma.com/tiaozheng.rar
    能用demo库给我演示哈正确的也行呀过了就给分
      

  10.   

    你的源码没法运行,数据库也没有,exe运行就是‘请检查数据库设置’,Database1没法打开,也报你说的错误。
    试一下:
    procedure TForm1.cxButton3Click(Sender: TObject);
    var
      SqlString:String;
    begin
      SqlString:='update billaid set deptid=desk.deptid,cfnid=desk.cfnid from billaid,desk where ( billaid.deskid = desk.deskid ) and ( ( billaid.billkindid = '+'''0403'''+' ) ) )';
      cxMemo3.Lines.Text:=SqlString;
      with Query1 do
      begin
        DataBase1.Close;
        DataBase1.Open;
        Database1.StartTransaction;
        try
          Close;
          Sql.Clear;
          Sql.Add(SqlString);
          ExecSQL;
          Database1.Commit;
        except
          Database1.Rollback;
          ShowMessage('数据提交失败');
        end;
        CommitUpdates;
      end;end;
      

  11.   

    你先确定一下,在调用StartTransaction前,Connected属性是否为True;或者调用TDatabase的open方法
      

  12.   

    我总是觉得语句应该没什么问题,问题出在事务本身,因为才接触delphi,所以对事务使用了解不多
    首先可以肯定当时Database1.Connected为True
    以下为尝试:
    1.我试过如果增加一个DBGrid DataSource链接好后,不用事务
      with Query1 do
      begin
        Close;
        Sql.clear;
        Sql.add('select ...');
        Open;
      end;
    -----------------------------程序正常
    2.在原有程序基础上,不用事务直接Sql.add(SqlString)后ExecSql;
    -----------------------------程序正常所以我认为问题应该出在事务提交上,语句问题不大,应该是有什么限制吧???????????我重新用原控件写了一个demo,高手帮忙看看,随便給我解释哈事务处理的一些限制也好
    地址:www.china-aorma\test.rar
      

  13.   

    好象不要用StartTransaction
    我记着好象是beginTransaction
      

  14.   

    数据库没有打开怎么提交?
    条件语句里   Database1.InTransaction  数据库没有打开怎么判断???先打开数据库再操作
      

  15.   

    地址是http://www.china-aroma/test.rar
      

  16.   

    地址是http://www.china-aroma.com/test.rar