请问如何建立MemoryTable?(50分)

  • 主题发起人 主题发起人 吴剑明
  • 开始时间 开始时间

吴剑明

Unregistered / Unconfirmed
GUEST, unregistred user!
如题。
请给个DEMO。
 
//我不会数据库,先给你一个资料 :-)
//有一些全角字符自己处理一下
//建立临时表?我喜欢叫内存表!

  数据输入是开发数据库程序的必然环节。在CLIENT/SERVER结构中,客户端可能要输
入一批数据后,再向服务器的后台数据库提交,这就需要在本地(客户端)建立临时数据
表来存储用户输入的数据,待提交后,清除本地表数据。这种方法的好处是:提高输入效
率,减小网络负担。

  由于用户一次输入的数据量一般情况下较小(不会超过几百条记录),所以临时表可
以建立在内存中,这样处理速度较快。

  方法1:使用查询控件(TQUERY)

  第1步:在窗体上放上查询控件(TQUERY),设置好所连接的数据表。

  第2步:使TQUERY. CACHEDUPDATES=TRUE;

   TQUERY. REQUESTLIVE=TRUE

  第3步:在原有的SQL语句后加入一条WHERE子语句,要求加入这条WHERE子语句后SQL
查询结果为空。

  例如:

  SELECT BIOLIFE.″SPECIES NO″, CATEGORY, COMMON_NAME,
BIOLIFE.″SPECIES NAME″, BIOLIFE.″LENGTH (CM)″, LENGTH_IN, NOTES, GRAPHIC

  FROM ″BIOLIFE.DB″ BIOLIFE

  WHERE BIOLIFE.CATEGORY=′A′ AND BIOLIFE.CATEGORY=′B′

  这样临时表就建立完成了。

  方法2:使用代码创建临时表

  代码如下:

  FUNCTION CREATETABLEINMEMORY(CONST AFIELDDEFS:TFIELDDEFS):

  TDATASET;

  VAR TEMPTABLE:TCLIENTDATASET;

  BEGIN

   TEMPTABLE:=NIL;

   RESULT:=NIL;

   IF AFIELDDEFS<>NIL THEN

   BEGIN

   TRY

   TEMPTABLE:=TCLIENTDATASET.CREATE(APPLICATION);

   TEMPTABLE.FIELDDEFS.ASSIGN(AFIELDDEFS);

   TEMPTABLE.CREATEDATASET;

   RESULT:=(TEMPTABLE AS TDATASET);

   EXCEPT

   IF TEMPTABLE<>NIL THEN TEMPTABLE.FREE;

   RESULT:=NIL;

   RAISE;

   END

   END

  END;

  在程序中按如下方法使用:

  PROCEDURE TFORM1.BUTTON1CLICK(SENDER: TOBJECT);

  VAR ADATASET:TDATASET;

  BEGIN

   ADATASET:=TDATASET.CREATE(SELF);

   WITH ADATASET.FIELDDEFS DO

   BEGIN

   ADD(′NAME′,FTSTRING,30,FALSE);

   ADD(′VALUE′,FTINTEGER,0,FALSE);

   END;

   WITH DATASOURCE1 DO

   BEGIN

   DATASET:=CREATETABLEINMEMORY(ADATASET.FIELDDEFS);

   DATASET.OPEN;

   END;

   ADATASET.FREE;

  END;

  临时表创建完成。

  方法1使用简单,但由于利用查询控件,清空数据时需要查询服务器后台数据库,所以
速度稍慢,而且不适用于临时表中各个字段由数个数据表的字段拼凑而成的情况。方法2适
用范围广、速度快,但需要编写代码。(代码中TFIELDDEFS的使用方法十分简单,
见DELPHI的联机帮助)。
 
用客户端数据集TClientDataSet,由于像保存在内存中的内容的数据结构已知
(需要那些字段,字段类型是什么),可以在Delphi编辑时就在TClientDataSet中生成
字段对象。(右键->FieldEditer->NewField),
然后CreateDataSet,就可以当后台基表一样用了。
但是不能对这个客户端数据集进行SQL查询,好在它在内存里,用历边一样快。

 
多人接受答案了。
 
后退
顶部