【问题标题】:How can I copy data from a database table into a textfile using Delphi?如何使用 Delphi 将数据库表中的数据复制到文本文件中?
【发布时间】:2013-09-12 12:05:13
【问题描述】:

我正在尝试将数据从 tblDeelnemersdbDeelnemers 复制到文本文件 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 继续。

【问题讨论】:

  • 您对局部变量的评论是正确的,但是您的第 5 行看起来很随意。即使COPY DML 语句出现在 Access SQL 解释器中,它也会 a) 操作整个行集 b) 不知道 local(!) 变量。
  • 您提到您正在使用 TQuery(带有过时的 BDE)?如果您使用 TADO(Query)Dataset,您可以通过 Dataset.SaveToFile / LoadFromFile 以二进制或 XML 格式 (pfAdtg,pfXML) 保存和加载数据。
  • 请不要在您的问题中添加更多细节以期待不同的答案。你需要问一个新问题——因为这是一个完全不同的问题。但是它向我指出,您没有创建查询 q := TADOQuery.Create(nil); 不仅如此,您甚至没有为 q 指定 SQL 语句。

标签: delphi ms-access copy delphi-7


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

【讨论】:

  • 但这在加载数据备份时对 OP 没有帮助。
  • @JerryDodge:我承认我没有看到关于之后加载表格的问题。请参阅我对您的回答的评论。
  • @No'am Newman 我现在在打开 TADOQuery 时收到以下错误(如代码中所示):Project PAT_p.exe 引发异常类 EAccessViolation 并显示消息“访问冲突在模块“PAT_p.exe”中的地址 004A990C。读取地址 8BD88CCB'。进程停止。使用 Step 或 Run 继续。
  • @sgtBlueBird 当您提出这个问题时,我确保您是否打算加载此数据备份。正如我在对此答案的评论中提到的,此解决方案不允许您备份此数据。请看一下我提供的答案。特别是对于像您一样不熟悉 Delphi 的人来说,这个解决方案完全超出您的想象(即使您可以重新加载它)。
  • @Jerry Dodge 我确实说过“...已打开(如代码中所示)..”在 TADOQuery 所在的 open; 部分的任何情况打开。;
【解决方案2】:

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

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

【讨论】:

  • 我很确定所有版本都有这个 - 将 MidasLib 添加到项目 DPR 的使用部分
  • @JerryDodge:我使用 Delphi 7 - clientdataset 组件同时具有 'savetofile' 和 'loadfromfile' 方法,因此这似乎确实是实现用户请求的最简单方法。 MidasLib 不必作为一个单元添加,只要 midas.dll 文件与最终程序位于同一目录下即可。如果多个程序将使用同一个 dll,这将非常有用。
  • 是的,这是可选的 - 如果包含 MidasLib,则不需要 DLL,如果不包含 MidasLib,则需要 DLL - DLL 也可以进入你的系统文件夹。无论哪种方式,无论此选项如何,概念都是相同的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
相关资源
最近更新 更多