0

我正在尝试将数据从tblDeelnemersof复制dbDeelnemers到文本文件中Deelnemers.txt

该表包含 4 列,即:ID、Naam、van、kontaknommer。我的表单上有一个TADOQuery以及一个dbGrid。我正在使用Microsoft AccessDelphi 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'。进程停止。使用 Step 或 Run 继续。

4

2 回答 2

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”会更快。此外,您应该在创建字符串列表时进行一些错误检查。

于 2013-09-09T13:34:48.957 回答
1

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

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

于 2013-09-09T04:38:47.910 回答