小弟在DELPHI中要做一个把数据从一个表导到另一个表中的操作.使用的是stringlist.
我现在已经把一个表中的数据赋给了stringlist,现在想把数据从stringlist中取出,把相应数据插入到另外一个表相应的字段中,应该怎么写?
其中数据库表中有10多个字段,几万条数据.每个字段之间用","隔开,其中一些字段中还含有空格.
我已经从第一张表中取出的两个数据如下所示:
61100700,2007-6-7 20:00:00,151.5,5600,6,6,2007-6-7 17:10:00,61100700,61100700,,,021
61100800,2007-6-7 20:00:00,151.5,5600,6,6,2007-6-7 19:10:00,61100800,61100800,,,021其中用逗号隔开的是不同字段的内容。在时间和日期字段中有空格。,两个逗号连在一起则表示一个空记录。
现要把这两条数据一条一条插入另一张表里去,应该怎么做?

解决方案 »

  1.   

    为什么要用stringlist,这样弄很麻烦的,直接用数据库控件快得多.
      

  2.   

    For I:= 0 to DataList.Count - 1 do
    begin  
      SomeStringList.CommaText := DataList[I];
      aDataSet.Append;
      aDataSet.Fields[0].AsString := SomeStringList[0];
      aDataSet.Fields[1].AsString := SomeStringList[1];
      .....
      aDataSet.Post;
    end;
      

  3.   

    1.建议将数据库数据放入TStringList时,每个字段用"",因为万一有数据中带有逗号,那会解析错误~
    2.分割行字段用SplitColumns
    Use IdStrings
      SplitColumns
    具体看帮助~
    建议用SQL语句解决,效率高,速度快~
      

  4.   

    to  zsr老牛,小弟试着解析过,但在时间字段内容那里,由于中间有空格,它把一个字段内容分成了两个。请问要避免这样应该怎么操作呢?
    to zhangpuqing 小弟用过listview来处理,但数据一多,处理非常慢,有时候还会无法响应,听说stringlist速度快,直接一次性放进缓存就可以了。所以想看看,但不懂怎么操作。
    to 西门吹牛 请问DATALIST是一个控件吗?不过小弟找了半天没找到,请赐教!
    to 笑青天 你所说的SplitColumns小弟没找到帮助,请问你是否能帮助小弟一下,多谢!
      

  5.   

    是你问题里提到的StringList, 可以查查TStringList.CommaText的帮助,完整伪码如下proceudure StringListToDataSet(DataList: TStrings; aDataSet: TDataSet);
    Var
      I: Ingeger
      SomeStringList: TStringList;
    Begin
    SomeStringList := TStringList.Create;
    Try
     For   I:=   0   to   DataList.Count   -   1   do 
     begin     
        SomeStringList.CommaText   :=   DataList[I]; 
        aDataSet.Append; 
        aDataSet.Fields[0].AsString   :=   SomeStringList[0]; 
        aDataSet.Fields[1].AsString   :=   SomeStringList[1]; 
        ..... 
        aDataSet.Post; 
     end;
    Finally
     SomeStringList.Free;
    End;End;
      

  6.   

    to   笑青天  小弟用了你所说的SplitColumns,解决了我那时间字段内容中的空格问题。但我的字段内容里面有NULL记录,在Stringlist表示方法是两个逗号连在一起,按理说我取出后应该显示空格字符,但用了SplitColumns后,它直接跳过了,这样应该怎么处理?
      还有就是,我在一张表中取出的纪录是很多条放到Stringlist中去,如我在提问时列出的两行表示两条记录。那么怎么把一条记录插入完毕后,把后面的记录也插入到另一张表中去?
    多谢了!
      

  7.   

    to 西门吹牛,谢谢你
    你的方法是把Stringlist中的数据插入到数据表中去吗?小弟用的是ADOQuery,请问是否可以这样用?
    还有,小弟的数据量是以万条计,每条数据有10多个字段的内容。请问Datalist.count就是指stringlist中的数据条数吗?
      

  8.   

    Count就是TStrings的行数,至于你的Query是否能这样使用只好你自己试试看了
      

  9.   

    一个表往另一个表导数据最好的办法当然是用SQL
    如果结构麻烦你也可以在源数据集下写个循环一次次的insert
    这样做有点出不不讨好 如果你坚持的话
    大概这样吧procedure test(srcList:TStrings//你的源LIST);
    var
      i:Integer;
      tmpList:TStrings;
    begin
      tmpList:=TStringList.Create ;
      try
        tmpList.Delimiter:=',';
        for i:=0 to srcList.Count-1 do
        begin
          tmpList.DelimitedText:=srcList[i];
          with Form1.qry1 do
          begin
            SQL.Text:='insert into tablename(field0,field1,...,field10)values('
              +Quotedstr(tmpList[0])+','
              +Quotedstr(tmpList[1])+','
             // ...
              +Quotedstr(tmpList[10])+')';
            ExecSQL;
          end;
        end;
      finally
        FreeAndNil(tmpList);
      end;
    end;如楼上所说 如果你的数据中有','那多半是会出问题的了
      

  10.   

    谢谢各位!
    问题已经解决了。
    可以把SQL语句放到Stringlist中去,然后可以做到从一张表中把数据一条条往Stringlist里面放的时候,同时插入另一张表中。于是等那边取完了,这边也已经插完了,等于能一次完成,提高效率。with DM.ADO_zhk do
               begin
                 Close;
                 SQL.Clear;
                 SQL.Text:='select * from st_river_f where stcd='''+s+''' and ftm>='''+starttime+''' and ftm<='''+endtime+'''';
                 Open;
                 first;
                  while not Eof do
                   begin
                    Stringlist.Add(Format('insert into st_river_f (stcd,ftm,fz,fq,wptn,FLWCHRCD,RLSTM,RLSINSTCD,DPNDST,REFTM,ANTRNF,BSAVP,FCCD,FLAG,rsSource) '+
                                  'values (''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'')',[FieldByName('stcd').AsString,
                                  FieldByName('ftm').AsString,FieldByName('fz').AsString,FieldByName('fq').AsString,FieldByName('wptn').AsString,FieldByName('FLWCHRCD').AsString,
                                  FieldByName('RLSTM').AsString,FieldByName('RLSINSTCD').AsString,FieldByName('DPNDST').AsString,FieldByName('REFTM').AsString,
                                  FieldByName('ANTRNF').AsString,FieldByName('BSAVP').AsString,FieldByName('FCCD').AsString,FieldByName('FLAG').AsString,FieldByName('rsSource').AsString]));
                    Next;
                   end;
               end;
    就是以上这个程序段。
    放在这里,也看能帮得上以后有相似需要的朋友吧。