我用rxmemorydata处理内存字段,但用在blob字段上就出错,提示type error.在网上查找,听说kbmmemtable可以解决此问题,请教高手,如何在kbmmemtable中保存和读取blob字段。是通过adoquery读出的图片字段存放在kbmmemtable的图片字段中,谢谢。
最好有代码,谢谢了。

解决方案 »

  1.   

    1.关于内存表的使用说明 
    一、   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-三月 
    在文档的头部份描述了表的字段结构,在下面则是数据区域。 
      

  2.   

    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.   

    3.以下代码用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;