1、请教各位高手:如用以下代码创建了一个TADODataSet控件,是不是用完了之后需要用代码释放它吗?还是等待Form关闭的时候,自动释放它(会自动吗?)
2、直接在DataModule里面创建TADODataSet,如果创建多个都是连接到一张表,会出现什么问题吗?有没有这方面的文章?谢谢!
请多多指教!

解决方案 »

  1.   

    1.要看你创建的方法, 如用TAdoDataSEt.Create(nil), Owner为空, 则需要用代码来释放. 
    如果用TAdoDataSEt.Create(Application), Owner为Application, 则应用程序在关闭时自动释放.
    2.一般不会有问题.但要注意记录死锁.
      

  2.   

    1.代码创建的tadodataset看你是怎么创建的,直接放到窗体上的,则由窗体进行生存器管理,窗体释放窗体上的组件也就都释放了;用代码创建如:DaTAset:=tadodataset.create(self);可以进行自管理,这样使用完之后FREE就可以释放了;如果是dataset:=tadodataset.create(nil),则属于无管理类型,这样你打开之后tadodataset回被初始化,里面存有很多字段对象,数据段,还有recno等等属性都被初始化,你需要将这些东东都赋为空才能释放掉dataset所站用的空间;
    2.在一个数据模块中创建多个连一个表,如果使用多线程的时候注意你的并发操作时候的互相的影响;不做同步的并发操作没什么关系;
      

  3.   

    var
       ADOdatasettmp : TADODataSet;
    begin
       {...}  
    try
        ADOdatasettmp := TADODataSet.Create(form1);
        ADODatasettmp.parent := form1;
        ADOdatasettmp.Connection := ADOConnection1;
         ADOdatasettmp.CommandText :='select * from department  ';
        ADOdatasettmp.Open;
      finally
            ADOdatasettmp.Close;
            ADOdatasettmp.Free;
      end;
    end;
        end;
      

  4.   

    谢谢!所谓的记录死锁是什么意思?怎么才会出现这种情况?我现在就是用DaTAset:=tadodataset.create(self);需不需要FreeAndNil(DataSet)?现在我也是在数据模块中使用了多个连一个表,就是害怕出现同步的并发操作,如果出现这种情况应该怎么处理?
      

  5.   

    记录死锁是指当你有线程A序对记录1,2进行批量写操作, 线程B序也对记录2,1进行批量写操作, 线程A会在写操作前对记录1,2进行锁定,当线程A锁定了记录1, 接着对记录2进行锁定,但这时候,  线程B已锁定记录2,而且正在等待锁定记录1.此时, 线程A,B同时在无限期地等待, 形成死锁.
      

  6.   

    我用的是Sql Server 2000,它能自己处理记录死锁的情况吗?还是需要我用代码解决,还是应该怎么解决?谢谢!
      

  7.   

    一般来说,解决死锁的办法是采用事务处理功能,如:
    try
      adoconnection1.begintrans;
      {执行你对数据库的操作}
      adoquery1.execsql;
      adoconnection1.commitTrans;
    except
      adoconnection1.RoolbackTrans;
    end;还有,SQL SERVER自己也提供也防止记录死锁的功能
      

  8.   

    SQLserver中的LockType 分为多个级别,
    看实际需要,看你的并发操作是不是很多;
    最乐观的情况是认为每个事务提交的时候都会最终被成功执行,
    多用户之间不会发生什么影响,这样的情况付出很大的死锁风险;而且容易出现脏数据;
    好处是各个操作数据的客户或(线程)对资源利用效率高;
    最悲观的情况是认为每个事务提交都会早成互相影响,这是高的锁定和隔离级别会让
    数据库保持最安全的一致性和避免死锁,但是会大大降低对资源的利用;
    根据具体情况设置适合自己的数据库隔离级别