大虾:
我用delphi7开发了一个基于oracle数据库的报表查询程序,用BDE连接。
其中,我是用query组件来进行查询数据。程序运行刚开始根据输入的查询条件要删除一个临时表,然后紧接着再建立这个临时表。
如:with query1 do
    ....
    drop table aa_Tbl
    ....
    with query1 do 
    ...
    create table aa_tbl 
    as
    select .....(因为每次输入的条件不同,该select返回的记录也不同,所以建立的该临时表内容也会变化。)
    建立完之后,再用这个临时表联接另一个表,创建另一个查询语句,得出报表所要的记录。现在主要的问题是,这个程序要很多人使用,而且不排除他们是同时使用,万一当某个用户对该临时表进行删除操作,而另一个用户正刚创建完这个临时表并将要进行查询语句时,这个怎么办?而且每个用户输入的条件不一样,则他们所创建的临时表也不同,如何保证他们下一个查询所用的临时表是根据他们的输入条件建立的临时表,而不是另外用户所建的临时表?希望高手给予答复!谢谢!

解决方案 »

  1.   

    用事务可以实现!
    delphi中的事务用Database实现,建议学习相关资料!
    也可以用存储过程实现!
    同样写SQL语句查询,但是是把SQL语句放到了数据库服务器上,delphi中利用TStoredProc控件实现!具体办法查看数据库编程的相关资料!
      

  2.   

    这段语句:
        with query1 do
        ....
        drop table aa_Tbl
        ....
        with query1 do 
        ...
        create table aa_tbl 
        as
        select .....
    应放在以下这个事务处理过程的哪里呢?procedure TForm1.QueryApplyClick(Sender: TObject);
    begin
      with Query1 do
      begin
          Database1.StartTransaction;
        try
            ApplyUpdates;   //写入数据库
            Database1.Commit; //写入成功,提交事务
        except
            Database1.Rollback; //写入失败,取消修改
            raise;
          end;
      CommitUpdates; //写入成功后,清除数据库缓存
      end;
    end;
      

  3.   

    把整段Sql语句放到事务提交前!
    可以是多句一起执行!Database1.StartTransaction
    with Query do
    begin
      Sql.clear
      Sql.Add(str1);
      Sql.Add(str2);
      Try
        ExecSql;
        //扑获异常
        if DataBase1.Errors.Count = 0 then
          Database1.Commit; //成功,事务提交
        else
          Database1.Rollback; //失败,事务回滚
      Except
        Database1.Rollback; //失败,事务回滚
      End;
    end;
      

  4.   

    不赞成用临时表的做法。因为临时表中的数据也是根据其它表中查出来的一个记录集,何不拿这个记录集跟另一个表join得出报表生成的记录集?应该写SQL就可以做到。