关于内存表的使用说明
一、 Delphi使用内存表
 1.1 Delphi创建内存表步骤:
1. 创建一个Ttable实例。
2. 设置一个DataBaseName为一个目录或是已有的数据库别名。
3. 指定TableName的值。
4. 设置TableType属性指明要创建的数据库表类型。(如果此属性为ttDefault表示数据库类型与TableName指定值的扩展名对应)。
5. 调用TTable.FidldDefs对象的Add方法向数据库表中添加字段。Add有4个参数:
 字段名:string。
 字段类型:TfieldType。
 字段大小:Word。一般只对String和Memo类型使用。
 字段是否NotNull: Boolean。
6. 使用TTable.IndexDefs.Add()方法定义索引。Add有三个参数:
 索引名:string;
 索引字段名:string;
 索引类型:TIndexOptions;
7. 调用TTable的CreateTable。这种方法适用于本地表。SQL表要用TQuery来创建。代码如下:
var
  MemTable: TTable;
begin
  with MemTable.Create(Self) do
  begin
    DatabaseName := 'c:\Temp';
    TableName := 'Test';
    TableType := ttParadox;
    with FieldDefs do
    begin
      Add('Age', ftInteger, 0, True);
      Add('Name', ftString, 25, False);
      Add('Weight', ftFloat, 0, False);
    end;
    IndexDefs.Add('', 'Age', [ixPrimary, ixUnique]);
    CreateTable;
  end;
end;
二、 kbmMemTable使用简述
2.1 kbmMemTable创建步骤:
1. 创建一个kbmMemTable对象实例。
2. 调用kbmMemTable.FidldDefs对象的Add方法向数据库表中添加字段。Add的方法和Delphi相同。
3. 使用kbmMemTable.IndexDefs.Add()方法定义索引。Add的方法和Delphi相同。
4. 调用kbmMemTable的CreateTable。
重要的区别:因为kbmMemTable不需要BDE的支持。所以不要指明DatabaseName, TableName和TableType三个属性。
  
代码如下:
with kbmMemTable1 do
  begin
    with kbmMemTable1.FieldDefs do
    begin
      Clear;
      Add('Period', ftInteger, 0, false);
      Add('VALUE', ftLargeInt, 0, false);
      Add('BytesField', ftBytes, 20, false);
      Add('Color', ftInteger, 0, false);
      Add('Date', ftDate, 0, false);
      Add('Memo', ftMemo, 0, false);
      Add('AutoInc', ftAutoInc, 0, false);
    end;
    with kbmMemTable1.IndexDefs do
    begin
      Clear;
      Add('Index1', 'VALUE', []);
    end;
    CreateTable;
  end;
三、与Delphi创建内存表的对比
3.1主从表功能
kbmMemTable可以象其它TDataSet一样,通过设置MasterSource和MasterField来简单的完成主从表的操作。
3.2 SQL功能
  没有发现kbmMemTable可以支持SQL语句的操作。它提供按字段排序和对排序字段的查找功能。
三、 kbmMemTable特点
从其它TDataSet得到数据。
代码如下:
LoadFromDataSet(Table1, [mtcpoStructure, mtcpoProperties]);
这样kbmMemTable就完全得到来自一个DataSet对象中的全部数据.
保存和载入内存表中数据的功能
Delphi的TTable不提供SaveToFile功能。
kbmMemTable提供保存到文件的功能,保存的文件有两种格式:
    Options: TkbmMemTable.SaveFlags; 
1. 二进制格式。kbmMemTable.SaveToBinaryFile('c:\test.bin', Options).
kbmMemTable1.LoadFromBinaryFile('c:\test.bin')
2. .csv格式。kbmMemTable.SaveToFile('c:\test.csv', Options);
             kbmMemTable1.LoadFromFile('c:\test.csv')
(一种Excel支持的文档格式)打开后的内容如下:
@@FILE VERSION@@ 200 
@@TABLEDEF START@@ 
Period=Integer,0,"Period","",10 
VALUE=LargeInt,0,"VALUE","",15 
BytesField=Bytes,20,"BytesField","",10 
Color=Integer,0,"Color","",10 
Date=Date,0,"Date","",10 
Memo=Memo,0,"Memo","",10 
AutoInc=AutoInc,0,"AutoInc","",10 
CALC=String,20,"CALC","",20 
@@TABLEDEF END@@ 
Period VALUE BytesField Color Date Memo AutoInc CALC
1 198 0 02/11/2001 This is a memo%n2001-11-2 10:19:52 1 0 1-二月
2 196 3 03/11/2001 This is a memo%n2001-11-2 10:19:52 2 1 2-三月
在文档的头部份描述了表的字段结构,在下面则是数据区域。
 

解决方案 »

  1.   

    以下代码用ClientDataSet建立一个内存表,包含Field1和Field2两个字段,在Field1上建索引:  with ClientDataSet1 do
      begin
        //添加Integer类型字段Field1
        with FieldDefs.AddFieldDef do 
        begin
          DataType := ftInteger;
          Name := 'Field1';
        end;
        //添加string类型字段Field2
        with FieldDefs.AddFieldDef do
        begin
          DataType := ftString;
          Size := 10;
          Name := 'Field2';
        end;
        //在Field1上建索引
        with IndexDefs.AddIndexDef do
        begin
          Fields := 'Field1';
          Name := 'IntIndex';
        end;
        //创建内存表
        CreateDataSet;
      end;
      

  2.   

    以下代码用ClientDataSet建立内存表,包含Field1和Field2两个字段,在Field1上建索引:  with ClientDataSet1 do
      begin
        //添加Integer类型的字段Field1
        with FieldDefs.AddFieldDef do 
        begin
          DataType := ftInteger;
          Name := 'Field1';
        end;
        //添加string类型的字段Field2
        with FieldDefs.AddFieldDef do
        begin
          DataType := ftString;
          Size := 10;
          Name := 'Field2';
        end;
        //在Field1上建索引
        with IndexDefs.AddIndexDef do
        begin
          Fields := 'Field1';
          Name := 'IntIndex';
        end;
        //创建内存表
        CreateDataSet;
      end;
      

  3.   

    谢谢大家了,这些对我很有用,但我现在还是有一些地方要请教:
        以下是我要实现的功能:
        有一个数据库D1,其中有数个表,其中的一个表中有数十万条记录,每条记录有8个字段,而且每个字段又有4k,这样的一个表,我需要在它里面查出一个与一个4K的数据匹配的记录。如果数据库在硬盘上,那它查起来的速度太慢,我就想是不是能把数据先一次性放到内存中再查。
        呵,请各位赐教!分还可以加~