我想在程序中将二维数组作为记录集使用(行对应记录,列对应字段),请问在Delphi中可以将一个二维数组装入一个记录集吗?

解决方案 »

  1.   

    其实所有Grid都是二维数组
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Col: Integer;
      Row: Integer;
      Rows: Integer;
      Cols: Integer;
      ArrData: array of array of Variant;  //动态二维数组
    begin
      Row := 0;
      if Ds.DataSet.RecordCount > 0 then  //DS是TDataSource
      begin
        Rows := Ds.DataSet.RecordCount;
        SetLength(ArrData, Rows);
        while not Ds.DataSet.Eof do
        begin
          Cols := Ds.DataSet.FieldCount;
          SetLength(ArrData[Row], Cols);
          for Col := 0 to Pred(Ds.DataSet.FieldCount) do
            ArrData[Row, Col] := Ds.DataSet.Fields[Col].Value;
          Inc(Row);
          Ds.DataSet.Next;
        end;
      end;
    end;
      

  2.   

    To:sanmaotuo(老冯)
        你可能理解错了,我问的是怎样将二维数组赋值给一个记录集,而不是记录集赋值给二维数组。谢谢!
      

  3.   

    呵呵,搞什么东东。你反过来写就可以了哈。一样的。不过多了一个Append哈.
      

  4.   

    Append完了后在一次性的Update哈
      

  5.   

    那怎么初始化一个创建的DS呢?我写的代码是
        DS := TDataSource.Create(self);
        DS.DataSet.FieldCount := 2;
        DS.DataSet.RecordCount := 2;
    编译时报错说FieldCount和RecordCount是只读的!
      

  6.   

    当然是ReadOnly.真的不会写啊? 那老冯又只好代劳了
      

  7.   

    我的想法是先Create一个DataSet,设定其FieldCount,再对其赋值,然后再将其赋给某个DataSource的DataSet,但不知如何实现,请赐教!
      

  8.   

    uses
      ActiveX, ADODB, DB;..........procedure TForm1.BtnWriteClick(Sender: TObject);
    var
      ADOConnection: TADOConnection;
      ADOTable: TADOTable;
      DataSource: TDataSource;
      ArrData: array[0..100, 0..10] of Variant;
    begin
      //你的数组赋值过程
      ArrData[0,0] := '2006';
      ArrData[0,1] := '女';
      ArrData[0,0] := '2007';
      ArrData[0,1] := '男';
      //......
      CoInitialize(nil);
      ADOConnection := TADOConnection.Create(nil);
      ADOConnection.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=WANGS;Data Source=.;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=HOME;Use Encryption for Data=False;Tag with column collation when possible=False';
      ADOConnection.LoginPrompt := False;  ADOTable := TADOTable.Create(nil);
      ADOTable.Connection := ADOConnection;
      ADOTable.TableName := 'TableID';  //创建数据源没有什么实际意义,只是演示让你知道怎样去动态创建
      DataSource := TDataSource.Create(nil);
      DataSource.DataSet := ADOTable;  //你的字段创建过程(字段数据类型有很多种,具体你去参阅DB单元)
      with TStringField.Create(ADOTable) do
      begin
        Size := 50;
        FieldName := 'Content';
        FieldKind := fkData; //字段类型有很多种,具体你去参阅DB单元
        DataSet := ADOTable;
      end;  with TStringField.Create(ADOTable) do
      begin
        Size := 50;
        FieldName := 'Sex';
        FieldKind := fkData;
        DataSet := ADOTable;
      end;
      //......  try
        //你的数据集赋值和提交过程 (根据你的数据量循环)
        try
          ADOConnection.Open;
          ADOConnection.BeginTrans;
          ADOTable.Open;
          ADOTable.Append;
          ADOTable.Fields[0].Value := ArrData[0,0];
          ADOTable.Fields[1].Value := ArrData[0,1];
          ADOTable.Post;
          ADOConnection.CommitTrans;
          ADOTable.Close;
          ADOConnection.Close;
        except
          ADOConnection.RollbackTrans;
          ADOConnection.Close;
        end;
        //......
      finally
        DataSource.Free;
        ADOTable.Free;
        ADOConnection.Free;
      end;
    end;
    ----以上代码测试通过。 测试员: 老冯
      

  9.   

    我把你的代码执行了一遍,程序走到ADOTable.Open时出错,说“对象名‘TableID’无效”。
      

  10.   

    呵呵。TableID是我这里的表,你自己另外找个表吧
      

  11.   

    另外ADOCONNECTION的CONNECTIONSTRING也需要根据你自己的情况修改
      

  12.   

    呵呵,我是一只小鸟,麻烦你了。
    还想问下,这种方法所用的DataSet是以ADOTable形式体现的,而ADOTable要与数据库中的表相关联,有没有不用和数据库表关联的创建DataSet的方法?因为我只想用DataSet本身,不想在数据库中单单为DataSet建立一个空表。谢谢!
      

  13.   

    建议用ClientDataSet,他的功能十分强大, 可以脱离数据库操作。100%能满足的的需求
      

  14.   

    ClientDataSet不是用在客户端的吗?它需要和应用服务器中DataModule的DataSetProvider连接。但我需要实现的是在应用服务器上定义一个方法将一个二维数组赋值给一个记录集,客户端调用应用服务器的这个方法得到返回的记录集,可以实现吗?