如何使用Delphi将数据库中的数据复制到文本文件中?

时间:2013-09-09 02:39:51

标签: delphi ms-access copy delphi-7

我正在尝试将tblDeelnemers dbDeelnemers的数据复制到文本文件Deelnemers.txt

该表包含4列,即:ID,Naam,van,kontaknommer。 我的表单上有 TADOQuery 以及 dbGrid 。我正在使用 Microsoft Access Delphi 7

我已经找到了可能的方法,但我能得到的唯一帮助就是C#。

我希望稍后在单击按钮时调用此文本文件。保存数据的格式无关紧要我只需将其加载回数据集即可。我这样做是因为在这个“导入”之后,表中的数据被删除,从头开始

我尝试了以下但是完全错误:

var
 sDeelnemers : string;//string to copy data in before adding to textfile
Begin // sIDkies is global string
    frmData.qryVGKompetisieDB.Active := false;   
    frmData.qryVGKompetisieDB.SQL.Text := 'copy ID, Naam, Van, Kontaknommer from tblDeelnemers into sDeelnemers WHERE ID = "'+sIDkies+'"; // copying data into string
    frmData.qryVGKompetisieDB.ExecSQL;
    frmData.qryVGKompetisieDB.SQL.Text := 'Select * from tblDeelnemers'; // to show table on dgGrid like originally
    frmData.qryVGKompetisieDB.Active := true;
end; // then assigning textfile and copying sDeelnemers(string) into textfile

感谢@ No'am Newman,现在的代码如下:

procedure TfrmData.Button1Click(Sender: TObject);
var
  f: tstrings;
  q: TADOQuery;
begin
  redInfo.Visible := false;
  dbgInfo.Visible := true;
  qryVGKompetisieDB.Active := false;
  qryVGKompetisieDB.SQL.Text := 'select id, naam, van, Kontaknommer from tblDeelnemers';
  qryVGKompetisieDB.ExecSQL;
  qryVGKompetisieDB.Active := true;

  f:= tstringlist.create;
 with q do
  begin
   open;    //Error occurs here 
   while not eof do
    begin
     f.add (fieldbyname ('id').asstring + ',' +
            fieldbyname ('naam').asstring + ',' +
            fieldbyname ('Van').asstring + ',' +
            fieldbyname ('Kontaknommer').asstring);
     next
    end;
   close
  end;

 f.savetofile ('Deelnemers.txt');
 f.free
end;

但是现在我在打开TADOQuery时遇到以下错误(如代码中所示):

  

项目PAT_p.exe引发异常类EAccessViolation,并在模块'PAT_p.exe'中显示消息'访问冲突地址004A990C'。读取地址8BD88CCB'。流程停止了。使用步骤或运行继续。

2 个答案:

答案 0 :(得分:1)

您要找的是ClientDataSet,可以SaveToFileLoadFromFile。您需要与您可能已经拥有的内容协调使用它 - 这意味着您需要将数据填充到此数据集中,然后从那里保存它。

请注意,这需要使用Midas.dll。我知道Delphi的后续版本可以选择是否需要它,但不确定这是否是Delphi 7中的一个选项。

答案 1 :(得分:1)

您可以迭代返回的集合并将每一行写入文本文件。您的查询似乎是

select id, naam, van, Kontaknommer
from tblDeelnemers

以下是一些基本代码,用于从表中的所有行中提取值并将其写入文本文件(实际上,csv文件 - 您可以选择分隔符)。

var
 f: tstrings;
 q: tquery; // whichever type you use

begin
 f:= tstringlist.create;
 with q do
  begin
   open;
   while not eof do
    begin
     f.add (fieldbyname ('id').asstring + ',' +  
            fieldbyname ('naam').asstring + ',' +
            fieldbyname ('Van').asstring + ',' +
            fieldbyname ('Kontaknommer').asstring);
     next
    end;
   close
  end;

 f.savetofile ('Deelnemers.txt');
 f.free
end;

使用永久字段(即qID.asstring等)而不是一直使用'fieldbyname'会更快。此外,您应该在创建stringlist时进行一些错误检查。